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);
    }                  
}