2012-04-17 49 views
3

我們有以下的情況:忽略特定URI的餅乾在Tomcat中

JSESSIONID是由cookie和URL發送,但因爲的Adobe Flash BUG的,它們是不同的(實際上,該cookie JSESSIONID是錯誤的) 。

我們想要做的是使用URL JSESSIONID而不是cookie中發送的URL。換句話說,當我執行request.getSession()時,它應該返回與URL中的ID關聯的HttpSession,而不是Cookie。

我們研究了Tomcat7的源代碼,事實上,Tomcat首先解析URL,搜索標識符。然後,如果它們存在,則使用Cookie SESSIONID覆蓋它。這裏是CoyoteAdapter.java剪斷代碼(Tomcat的7.0.26):

 String sessionID = null; 
     if (request.getServletContext().getEffectiveSessionTrackingModes() 
       .contains(SessionTrackingMode.URL)) { 

      // Get the session ID if there was one 
      sessionID = request.getPathParameter(
        SessionConfig.getSessionUriParamName(
          request.getContext())); 
      if (sessionID != null) { 
       request.setRequestedSessionId(sessionID); 
       request.setRequestedSessionURL(true); 
      } 
     } 

     // Look for session ID in cookies and SSL session 
     parseSessionCookiesId(req, request); 
     parseSessionSslId(request); 

我們可以禁用cookie JSESSIONID所有,但我們可以,因爲我們用它在網站上的所有URL不會。我們希望爲這個特定網址禁用Cookie。

可能嗎?有沒有其他的想法或解決方法來解決這個問題?

回答

-1

您可以實現一個自定義servlet filter,它將用您自己的包裝來替換請求,響應和會話對象。然後,封裝程序可以根據URL來表現不同的行爲,例如,委託或不委託給原始會話實例。儘管您無法訪問某些其他ID的會話數據,但無需更改Tomcat代碼。

+0

這不起作用,因爲當執行過濾器時,會話對象已經建好(這意味着在我們進入過濾器之前使用了cookie jsessionid) – 2012-04-17 14:55:21

+0

您是否測試了它?我非常確定會話實例在第一次getSession()調用之前不會被創建/恢復。 – 2012-04-17 16:44:54

+0

是的。我們測試了它:-) - 我們也嘗試使用閥門,但我們遇到了同樣的問題。確實,在第一次getSession()調用之前沒有創建會話,但sessionId已經與請求關聯(如上面的代碼所示) – 2012-04-17 17:15:41