2012-04-28 126 views
1

我的設置如下如何避免創建會話?

  • 主應用程序的servlet訪問下/對myApp/mainServlet/
  • ,增加了安全性頭(用戶名,密碼),以SOAP調用從未來的一個小「手工製作」肥皂代理客戶
  • 一個Flex客戶端,通過這種肥皂代理

Flex客戶端已經被設置時,會話ID會談主要的servlet(通過BlazeDS的接口),併發送一些SOAP調用給第三方它首先與t談話他主要的servlet,它返回一個HTTP頭,如「Set-Cookie:」JSESSION:某事; Path =/myApp「,然後將這個cookie發送到服務器,以通知客戶端與哪個會話相關聯

問題是,小肥皂代理返回一個cookie與會話id通過它進行調用) - 然後Flex客戶端在與主servlet通話時使用這些cookie。這些其他會話ID是未知的,然後當然沒有任何工作...

我不想要會話cookie從肥皂代理回來了,我已經驗證問題將通過講述一個Apache前端去除所有「設置Cookie」頭從SOAP代理來這樣做來解決。不幸的是(由於一些設置限制),這不是我可以投入生產的一種方式,所以我需要以編程方式修復它。

我怎樣才能讓這個servlet不嘗試設置任何會話ID?我相信我所看到的告訴碼頭(應用服務器)不發送會話ID的方法,但是,這也將影響主servlet的這樣做,以及能力,也無法移植。

代理Servlet是一個非常基本的春天控制器(只是實現接口),所以基本上只是一個裸骨的servlet。

回答

2

刪除cookie可以與res.setHeader("Set-Cookie", null);

編輯來完成:這是很好的瞭解,這將刪除所有餅乾,因爲它們在相同的標題全部設置。

我建議你不這樣做,在你的servlet,一個過濾器是更好的,因爲它的較少干擾,是這樣的:

public void doFilter(ServletRequest request, 
      ServletResponse response, 
      FilterChain chain) 
       throws IOException, ServletException 
{ 
    HttpServletResponse res = (HttpServletResponse) response; 

    try 
    { 
     chain.doFilter(request, res); 
    } 
    finally 
    { 
     res.setHeader("Set-Cookie", null); 
    } 
} 

該解決方案通過在this article靈感randomcoder。

+0

感謝您的回答,基里爾!順便說一句 - 你是否暗示說會話總是在Java Servlet容器中創建的?我在問,因爲我不確定規格說什麼。誰負責進行會議? – oligofren 2012-04-29 08:37:18

+1

@oligofren您可以使用'responce.getSession()'創建會話。你說你有一個「SOAP代理」,它是如何代理的,以及在哪裏? SOAP響應來自的實際位置是否可以設置cookie? – jmruc 2012-04-29 09:11:07

+0

好點!我從來沒有想到,但是:是的,它重定向到Axis服務(在Glassfish上運行),當然可以設置會話ID。一些試驗用裸露的骨頭的servlet(在http://www.sonatype.com/books/mvnex-book/mvnex-examples.zip CH-簡單的Web /簡單Web應用程序代碼)後,我現在可以看到一個基本的servlet沒有返回一個JSESSIONID - 除非我做了一個getSession()。所以你確實是對的 - 會話cookie來自服務器,我代理請求! – oligofren 2012-04-29 10:01:49