SpringWebServiceTemplate向Cookie头添加值

SpringWebServiceTemplate向Cookie头添加值,spring,cookies,soap,webservicetemplate,Spring,Cookies,Soap,Webservicetemplate,我必须在我的应用程序发送到另一个应用程序的请求的cookie中添加一个信息, 但它似乎没有被正确地添加 当我使用WireShark检查请求时,我在标题中看到两个Cookie标题: POST /service HTTP/1.1 Accept-Encoding: gzip Cookie: iam=************************** Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 SOAPA

我必须在我的应用程序发送到另一个应用程序的请求的cookie中添加一个信息, 但它似乎没有被正确地添加

当我使用WireShark检查请求时,我在标题中看到两个Cookie标题:

POST /service HTTP/1.1
Accept-Encoding: gzip
Cookie: iam=**************************
Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
SOAPAction: ""
Content-Type: text/xml; charset=utf-8
Content-Length: 128393
Host: host-dev:9999
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.10 (Java/1.8.0_271)
Cookie: JSESSIONID=***********************
Authorization: Basic **************************
(我更改了一些信息)

在我的代码中,我有:

@Service
public class ESignatureSoapConnector extends WebServiceGatewaySupport {

    private ObjectFactory objectFactory;

    @Autowired
    public ESignatureSoapConnector(ESignatureMarshaller marshaller, ConfigurationProperties configurationProperties) throws Exception { 
        this.setMarshaller(marshaller);
        this.setUnmarshaller(marshaller);
        this.setDefaultUri(configurationProperties.getBaseUrl());
        this.setMessageSender(buildMessageSender(configurationProperties.getUsername(), configurationProperties.getPassword()));

        this.objectFactory = new ObjectFactory();
    }

    public ESignatureResponse signDocument(MTOMFile file, String iamCookieValue) {
        ESignature request = new ESignature();
        request.setInputDocument(file);
        JAXBElement<ESignatureResponse> response = (JAXBElement<ESignatureResponse>) getWebServiceTemplate()
                .marshalSendAndReceive(objectFactory.createESignature(request), new WebServiceMessageCallback() {
                    @Override
                    public void doWithMessage(WebServiceMessage webServiceMessage) throws IOException, TransformerException {
                        TransportContext context = TransportContextHolder.getTransportContext();
                        HttpComponentsConnection connection = (HttpComponentsConnection) context.getConnection();
                        HttpPost post = connection.getHttpPost();
                        post.addHeader("Cookie", "iam=" + iamCookieValue);
                    }
                });
        return response.getValue();
    }

    private WebServiceMessageSender buildMessageSender(String username, String password) throws Exception {
        ...
    }

}
@服务
公共类ESignatureSoapConnector扩展了WebServiceGatewaySupport{
私有对象工厂对象工厂;
@自动连线
公共ESignatureSoapConnector(ESignatureMarshaller封送器,ConfigurationProperties ConfigurationProperties)引发异常{
这个。塞特马歇尔勒(马歇尔勒);
这是塞图马歇尔(马歇尔);
this.setDefaultUri(configurationProperties.getBaseUrl());
this.setMessageSender(buildMessageSender(configurationProperties.getUsername(),configurationProperties.getPassword());
this.objectFactory=新的objectFactory();
}
公共ESignatureResponse signDocument(MTOMFile文件,字符串iamCookieValue){
ESignature request=新的ESignature();
request.setInputDocument(文件);
JAXBElement响应=(JAXBElement)getWebServiceTemplate()
.marshalSendAndReceive(objectFactory.CreateSignature(请求),新WebServiceMessageCallback(){
@凌驾
public void doWithMessage(WebServiceMessage WebServiceMessage)引发IOException、TransformerException{
TransportContext上下文=TransportContextHolder.getTransportContext();
HttpComponentConnection=(HttpComponentConnection)上下文。getConnection();
HttpPost=connection.getHttpPost();
post.addHeader(“Cookie”、“iam=“+iamCookieValue”);
}
});
返回response.getValue();
}
私有WebServiceMessageSender buildMessageSender(字符串用户名、字符串密码)引发异常{
...
}
}
我假设我设置cookie的方法不正确,但我找不到正确的方法。
每个请求的cookie值都不同,这是一个soap请求,我在Spring中工作,我们找到了以下解决方案:

JAXBElement<ESignatureResponse> response = (JAXBElement<ESignatureResponse>) getWebServiceTemplate()
                .marshalSendAndReceive(objectFactory.createESignature(request), new WebServiceMessageCallback() {
                    @Override
                    public void doWithMessage(WebServiceMessage webServiceMessage) throws IOException, TransformerException {
                        HttpClient httpClient = ((HttpComponentsMessageSender) getWebServiceTemplate().getMessageSenders()[0]).getHttpClient();
                        BasicClientCookie iamCookie = new BasicClientCookie(iamConfigurationProperties.getCookieName(), iamCookieValue);
                        iamCookie.setDomain(iamConfigurationProperties.getCookieDomain());
                        iamCookie.setPath(iamConfigurationProperties.getCookiePath());
                        ((DefaultHttpClient) httpClient).getCookieStore().addCookie(iamCookie);
                    }
                });
JAXBElement响应=(JAXBElement)getWebServiceTemplate()
.marshalSendAndReceive(objectFactory.CreateSignature(请求),新WebServiceMessageCallback(){
@凌驾
public void doWithMessage(WebServiceMessage WebServiceMessage)引发IOException、TransformerException{
HttpClient HttpClient=((HttpComponentsMessageSender)getWebServiceTemplate().getMessageSenders()[0]).getHttpClient();
BasicClientCookie iamCookie=新的BasicClientCookie(iamConfigurationProperties.getCookieName(),iamCookieValue);
setDomain(iamConfigurationProperties.getCookieDomain());
setPath(iamConfigurationProperties.getCookiePath());
((DefaultHttpClient)httpClient.getCookieStore().addCookie(iamCookie);
}
});

哪些内容没有添加?此外,您还应该添加一个cookie(最终是一个标头,但仍然是)。我添加的cookie(值为“iam=***”)在只有一个cookie标头时创建第二个cookie,不同的值由;分隔。没有post.addCookie(),我唯一能做的就是.addHeader()然后获取当前值(
getHeaders
),将其追加,然后
setHeader
,而不是
addHeader
。或者使用Cookie管理器设置Apache HttpClient,并在其中设置一个值,以便将其添加到传出请求中。由于另一个cookie(JSESSIONID)在cookie存储中,因此当我执行getHeaders()时,它不在那里,并且它将我的cookie添加为一个头。最好是访问cookie存储并添加cookie,但我找不到如何访问它