Apache CXF 拦截器捕获(并最终更改)传出 URL
Apache CXF Interceptor to capture (and eventually change) the outgoing URL
我在 tomcat 中有一个使用 SOAP 网络服务的应用程序 运行。我需要能够通过拦截器修改拦截器链中远程 Web 服务的 URI。
URI 在端点中有 pre-configured 个参数,我需要在我的应用程序中删除这些参数,因为我使用的库将端点中的参数作为开关传递给它,以执行各种内部功能。所以我从端点剥离参数,将其传递给库,库又使用 CXF 执行传出连接。
我需要通过拦截器,因为我无法修改库或覆盖库中的 类,将这些参数放回端点。
我尝试在拦截器中直接访问 headers 使用:
public class EndpointInterceptor extends AbstractPhaseInterceptor {
private static final Logger LOGGER = LogManager.getLogger(EndpointInterceptor.class.getName());
public EndpointInterceptor() {
super(Phase.PRE_STREAM);
}
@Override
public void handleMessage(Message message) throws Fault {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
String requestURI = (String) message.get(Message.class.getName() + ".REQUEST_URI");
LOGGER.debug("requestURI: " + requestURI);
Map<String, List<String>> headers = CastUtils.cast((Map) message.get(Message.PROTOCOL_HEADERS));
List sa = null;
String hostName=null;
if (headers != null) {
sa = headers.get("host");
for (Map.Entry<String,List<String>> entry : headers.entrySet()) {
LOGGER.debug("entry key: " + entry.getKey());
for (String s : entry.getValue()) {
LOGGER.debug(" value: " + s);
}
}
}
if (sa != null && sa.size() == 1) {
hostName = "https://"+ sa.get(0).toString()+requestURI;
}
LOGGER.debug("hostname: " + hostName);
}
}
但这只会让我接受并连接 headers,而且(到目前为止)仅在 PRE_STREAM 和进一步的阶段。
那么,这是否可能,如果可能,我如何在拦截器中访问该 URI 以至少记录并希望修改它。
我找到了这个。只需要在包 org.apache.cxf.message
;
中使用 Message.java
中的正确值
public class EndpointInterceptor extends AbstractPhaseInterceptor {
private static final Logger LOGGER = LogManager.getLogger(EndpointInterceptor.class.getName());
public EndpointInterceptor() {
super(Phase.POST_LOGICAL);
}
@Override
public void handleMessage(Message message) throws Fault {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
String address = (String)message.get(Message.ENDPOINT_ADDRESS);
address = "test.com"
message.put(Message.ENDPOINT_ADDRESS, address);
}
}
我在 tomcat 中有一个使用 SOAP 网络服务的应用程序 运行。我需要能够通过拦截器修改拦截器链中远程 Web 服务的 URI。
URI 在端点中有 pre-configured 个参数,我需要在我的应用程序中删除这些参数,因为我使用的库将端点中的参数作为开关传递给它,以执行各种内部功能。所以我从端点剥离参数,将其传递给库,库又使用 CXF 执行传出连接。
我需要通过拦截器,因为我无法修改库或覆盖库中的 类,将这些参数放回端点。
我尝试在拦截器中直接访问 headers 使用:
public class EndpointInterceptor extends AbstractPhaseInterceptor {
private static final Logger LOGGER = LogManager.getLogger(EndpointInterceptor.class.getName());
public EndpointInterceptor() {
super(Phase.PRE_STREAM);
}
@Override
public void handleMessage(Message message) throws Fault {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
String requestURI = (String) message.get(Message.class.getName() + ".REQUEST_URI");
LOGGER.debug("requestURI: " + requestURI);
Map<String, List<String>> headers = CastUtils.cast((Map) message.get(Message.PROTOCOL_HEADERS));
List sa = null;
String hostName=null;
if (headers != null) {
sa = headers.get("host");
for (Map.Entry<String,List<String>> entry : headers.entrySet()) {
LOGGER.debug("entry key: " + entry.getKey());
for (String s : entry.getValue()) {
LOGGER.debug(" value: " + s);
}
}
}
if (sa != null && sa.size() == 1) {
hostName = "https://"+ sa.get(0).toString()+requestURI;
}
LOGGER.debug("hostname: " + hostName);
}
}
但这只会让我接受并连接 headers,而且(到目前为止)仅在 PRE_STREAM 和进一步的阶段。
那么,这是否可能,如果可能,我如何在拦截器中访问该 URI 以至少记录并希望修改它。
我找到了这个。只需要在包 org.apache.cxf.message
;
Message.java
中的正确值
public class EndpointInterceptor extends AbstractPhaseInterceptor {
private static final Logger LOGGER = LogManager.getLogger(EndpointInterceptor.class.getName());
public EndpointInterceptor() {
super(Phase.POST_LOGICAL);
}
@Override
public void handleMessage(Message message) throws Fault {
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
String address = (String)message.get(Message.ENDPOINT_ADDRESS);
address = "test.com"
message.put(Message.ENDPOINT_ADDRESS, address);
}
}