我一直致力于开发安全代理后面的CXF Web服务,该代理要求在服务调用之前进行HTTP基本身份验证.这些服务彼此之间进行通信,并要求对请求和响应进行身份验证.
到目前为止,我已经能够通过HTTPConduit为请求设置HTTP基本身份验证,如下所示:
Client client = ClientProxy.getClient(port);
HTTPConduit conduit = (HTTPConduit) client.getConduit();
AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();
authorizationPolicy.setUserName(username);
authorizationPolicy.setPassword(password);
authorizationPolicy.setAuthorizationType("Basic");
conduit.setAuthorization(authorizationPolicy);
Run Code Online (Sandbox Code Playgroud)
在每个服务方法调用上调用上面的方法,并且我以正式的形式获得正确的入站消息
INFO: Inbound Message
----------------------------
ID: 1
Address: http://someURL/someService?wsdl
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[*/*], Authorization=[Basic {TOKEN}],
cache-control=[no-cache], connection=[keep-alive],
Content-Length=[735], content-type=[text/xml; charset=UTF-8],
pragma=[no-cache], ...}
Payload: <soap:Envelope>...</soap:Envelope>
--------------------------------------
Run Code Online (Sandbox Code Playgroud)
但是,响应不包含所需的标头
INFO: Outbound Message
---------------------------
ID: 2
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope/">...</soap:Envelope>
--------------------------------------
Run Code Online (Sandbox Code Playgroud)
如何修改响应HTTP标头?我试过了
((BindingProvider)port).getResponseContext().put(
MessageContext.HTTP_RESPONSE_HEADERS,
Collections.singletonMap("Authentication",
Collections.singletonList("Basic "+token)));
Run Code Online (Sandbox Code Playgroud)
没有得到理想的结果.