2012-01-13 33 views
4

我是Web服務中的新手。我有一個JAX-WS服務,我需要實現會話機制。 SOAP消息通過HTTP傳輸,我們使用WebLogic,因此JAXWS應用程序部署在WebLogic應用程序服務器上,服務可以從WSDL文檔訪問。如何使JAX-WS webservice以JSESSIONID響應(會話ID)

我有@WebServiceProvider(類實現供應商<的SOAPMessage>)

現在,當我火的登錄請求我要發送JSESSIONID會話cookie回來了,但我們不希望使用CXF或其他任何,就是所謂的麥德龍,坦率地說,我還沒有完全理解。我們也不希望將其作爲持久性cookie,因此手動向響應頭添加cookie也不是一種選擇。但那是有效的,我試了一下。我只是不明白爲什麼會話cookie沒有自動設置。

我一直在尋找網絡,並嘗試了很多東西4天了,沒有任何工作。請幫忙。

+0

尼沙, 你提到的消息來源是使用。但是您在此線程中發佈的代碼使用HTTPBinding.HTTP_BINDING。這是對的嗎 ? – UmeshPathak 2012-02-17 21:04:15

+0

根據我當時發現的文檔(現在沒有鏈接),這是正確的,但我們決定去手動添加一個cookie的解決方案(設置過期時間爲0使cookie不持久),這是足夠好的現在爲我們。 – nisenish 2012-03-06 00:12:18

回答

3

我找到了答案,以我自己的問題。問題在於WebServiceProvider實現中使用綁定的方式。如果使用HTTP綁定類型,則SOAPMessage不能用作Provider的類型。這裏的正確的解決方法是使用源(不知道別的東西可太習慣,沒試過),即

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。

您可以通過注入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"); 
+0

不幸的是,這不起作用,我試過了,以及@Stateful和@HttpSessionScope註釋(沒有空格)。我的意思是會話確實存在,但是當我監視tcpmon中的請求響應時,它不顯示jsessionid,所以我無法在使用端捕獲它。甚至當我使用MAINTAIN_SESSION_PROPERTY時,下次調用SOAP服務器時,會話ID也不同,所以基本上它不會通過HTTP將會話傳輸回客戶端。將它添加到SOAP消息是一個選項,但我們不希望這樣做,我們希望它在HTTP響應中傳回。 – nisenish 2012-01-13 01:14:32

+0

這幾乎是它在http://docs.oracle.com/cd/E15523_01/web.1111/e13734/stateful.htm中的佈局。你是否對客戶端的後續請求使用相同的代理? – jtahlborn 2012-01-13 02:11:26

+2

@NIsa - 您是否在客戶端啓用了httpsession? ((BindingProvider)proxy).getRequestContext()。put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);' – Kal 2012-01-13 03:16:57