Как заставить веб-сервис JAX-WS отвечать JSESSIONID (идентификатор сеанса) - PullRequest
4 голосов
/ 13 января 2012

Я новичок в веб-сервисах. У меня есть служба JAX-WS, для которой мне нужно реализовать механизм сессии. Сообщения SOAP транспортируются по HTTP, мы используем WebLogic, поэтому приложение JAXWS развернуто на сервере приложений WebLogic, а службы доступны из документа WSDL.

У меня есть @WebServiceProvider (класс, реализующий Provider )

Теперь, когда я запускаю запрос на вход в систему, я хочу, чтобы cookie-файл сеанса JSESSIONID отправлялся обратно, но мы не хотим использовать CXF или что-то еще, просто так называемое Metro, что, честно говоря, я еще полностью не понимаю. Мы также не хотим, чтобы это был постоянный файл cookie, поэтому ручное добавление файла cookie в заголовок ответа также невозможно. Но это работает, я попробовал. Я просто не понимаю, почему сессионный cookie не устанавливается автоматически.

Я искал в Интернете и пробовал много вещей в течение 4 дней, ничего не работает. Пожалуйста, помогите.

Ответы [ 2 ]

3 голосов
/ 24 января 2012

Я нашел ответ на свой вопрос. Проблема заключалась в том, как привязки используются в реализации WebServiceProvider. Если используется тип привязки HTTP, то SOAPMessage нельзя использовать в качестве типа для провайдера. Правильное решение здесь - использовать Source (не уверен, что можно использовать что-то еще, не пытался), т.е.

package com.primavera.ws.jaxws.provider;

import javax.annotation.Resource;
import javax.xml.ws.BindingType;
import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.WebServiceProvider;

@WebServiceProvider(portName="MyPort", serviceName="MyService", targetNamespace="http://mytargetlocation", wsdlLocation="WEB-INF/wsdl/My.wsdl")
@ServiceMode(value = Service.Mode.MESSAGE)
@BindingType(HTTPBinding.HTTP_BINDING)

public class MyProvider implements Provider<Source> {

    @Resource
    private WebServiceContext context;


    public MyProvider()
    {
    }

    @Override
    public Source invoke(Source request)
    {
        MessageContext mc = context.getMessageContext();
        HttpSession session =    ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
        if (session == null)
            throw new WebServiceException("No HTTP Session found");

        System.out.println("SessionID: " + session.getId());

        return request;
    }
}
3 голосов
/ 13 января 2012

Как правило, простого доступа к HttpSession в вашем веб-сервисе должно быть достаточно для установки cookie сеанса в вашем ответе.

Вы можете сделать это, внедрив WebServiceContext в ваш веб-сервис следующим образом -

@Resource
private WebServiceContext ctx;
public void webServiceMethod() {
     MessageContext mc = ctx.getMessageContext();
     HttpSession session =    ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
     if (session == null)
         throw new WebServiceException("No HTTP Session found");
...