2012-01-13 3 views
4

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

私がログイン要求を発射するとき、私は今、私はJSESSIONIDセッションCookieが送り返さなければ@WebServiceProvider(プロバイダ<たSOAPMessage>を実装するクラス)

たくてきたが、我々はCXFまたは何か他のものを使用したくありません私はまだ完全に理解していません。これを永続的なクッキーにしたくないので、クッキーを手動でレスポンスヘッダに追加することもオプションではありません。しかし、それは動作し、私はそれを試した。セッションクッキーが自動的に設定されない理由を理解できません。

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

+0

あなたはSOURCEが使用される述べた ニサを、使用することです。このスレッドで投稿したコードはHTTPBinding.HTTP_BINDINGを使用しています。それが正しいか ? – UmeshPathak

+0

私は戻って見つけたドキュメントによればこれは正しいですが、私たちは手動でクッキーを追加するという方法で解決しました(有効期限を0に設定するとクッキーは非永続化します)。私たちのために今。 – nisenish

答えて

3

。この問題は、WebServiceProvider実装でバインディングを使用する方法にありました。 HTTPバインディングタイプが使用されている場合、SOAPMessageはProviderのタイプとして使用できません。ここでの正しい解決策は、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

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

あなたはそうのようなWebサービスに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"); 
+0

残念ながら、これはうまくいきません。試してみましたが、@ Statefulと@ HttpSessionScopeアノテーション(スペースなし)もあります。私はセッションが存在していることを意味しますが、tcpmonで要求応答を監視すると、jsessionidが表示されないので、使用側で捕捉できません。私がMAINTAIN_SESSION_PROPERTYを使用していても、次回はSOAPサーバーがセッションIDと呼ばれているので、基本的にHTTP経由でセッションをクライアントに戻すことはありません。それをSOAPメッセージに追加することはオプションですが、これをやりたくないので、HTTP応答に戻すことができます。 – nisenish

+0

これはhttp://docs.oracle.com/cd/E15523_01/web.1111/e13734/stateful.htmに記載されている方法とほぼ同じです。あなたはクライアント側の後続のリクエストに同じプロキシを使用していますか? – jtahlborn

+2

@NIsa - クライアントでhttpsessionを有効にしていますか?これは、プロバイダを実装する@WebServiceProviderを実装するときに、(WebServiceContextコンテキスト、SOAPMessage()を呼び出すメソッドを1つだけ持つ).getRequestContext()。put(BindingProvider.SESSION_MAINTAIN_PROPERTY、true); ' – Kal

関連する問題