Spring WebServiceTemplate добавляет значение в заголовок cookie

#spring #cookies #soap #webservicetemplate

#spring #файлы cookie #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
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 {
        ...
    }

}
  

Я предполагаю, что способ установки файла cookie неверен, но я не могу найти правильный способ сделать это.
Значение для файла cookie отличается для каждого запроса, это запрос soap, и я работаю в Spring

Комментарии:

1. Что не добавлено? Также вы должны добавить файл cookie (который в конечном итоге является заголовком, но все же).

2. Добавляемый мной файл cookie (со значением «iam= ****») создает второй файл cookie, когда должен быть только один заголовок cookie, с разными значениями, разделенными символом ; . Нет post.addCookie(), единственное, что я могу сделать, это .AddHeader()

3. Затем получите текущее значение ( getHeaders ) и добавьте его, а затем setHeader , вместо addHeader . Или настройте Apache HttpClient с помощью диспетчера файлов cookie и задайте там значение, чтобы оно было добавлено к исходящему запросу.

4. Я попытался сначала получить заголовки, но это ничего не меняет. Поскольку другой файл cookie (JSESSIONID) находится в хранилище файлов cookie, когда я выполняю getHeaders(), его там нет, и он добавляет мой файл cookie в качестве заголовка. Лучше всего было бы получить доступ к хранилищу файлов cookie и добавить файл cookie, но я не могу найти, как получить к нему доступ

Ответ №1:

Решение, которое мы нашли :

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

Комментарии:

1. в моем случае я получил исключение приведения класса в соответствии с HttpClient = (невозможно привести к HttpUrlConnectionMessageSender итак, мое решение: new ObjectFactory().createCall(call), webServiceMessage -> { TransportContext transportContext = TransportContextHolder.getTransportContext(); HttpUrlConnection connection = (HttpUrlConnection) transportContext.getConnection(); connection.addRequestHeader("name", "value"); }