4

私はWebサービスの初心者です。セッションメカニズムを実装する必要がある JAX-WS サービスがあります。SOAP メッセージは HTTP 経由で転送され、WebLogic を使用するため、JAXWS アプリケーションは WebLogic アプリ サーバーにデプロイされ、WSDL ドキュメントからサービスにアクセスできます。

@WebServiceProvider (Provider< SOAPMessage > を実装するクラス) があります。

ログイン要求を発行したときに、JSESSIONID セッション Cookie を送り返したいのですが、CXF など、いわゆる Metro を使用したくありません。率直に言って、まだ完全には理解できていません。また、これを永続的な Cookie にしたくないため、手動で応答ヘッダーに Cookie を追加することもできません。しかし、それは機能します、私はそれを試しました。セッション Cookie が自動的に設定されない理由がわかりません。

私はウェブを検索していて、4日間多くのことを試していますが、何もうまくいきません. 助けてください。

4

2 に答える 2

3

通常、WebサービスでHttpSessionにアクセスするだけで、応答にセッションCookieを設定できます。

これを行うには、次のようにWebServiceContextをWebサービスに挿入します-

@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");
于 2012-01-13T00:54:49.147 に答える
3

私は自分の質問に対する答えを見つけました。問題は、バインディングが 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;
    }
}
于 2012-01-23T22:31:21.980 に答える