2016-11-22 86 views
1

我在我的應用程序的web.xml設置Cookie路徑(如建議here)來嘗試:餅乾<path>/</path>和JSESSIONID

<session-config> 
    <cookie-config> 
     <path>/</path> 
    </cookie-config> 
</session-config> 

於是我分別兩個相同的Web應用程序部署到localhost:8080/application-alocalhost:8080/application-b

每個應用程序是一個單獨的servlet:

public class ControllerServlet extends HttpServlet{ 
    @Override 
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { 
     HttpSession session = req.getSession(false); 

     if (session == null) { 
      session = req.getSession(true); 
      System.out.printf("No session was present - new one created with JSESSIONID=[%s]\n", session.getId()); 
     } else { 
      System.out.printf("JSESSIONID cookie was present and HttpSession objects exists with JSESSIONID=[%s]\n", session.getId()); 
     } 
    } 
} 

我部署應用到Tomcat 8.5容器(使用Tomcat 9試圖以及行爲是相同的)。當我和我的瀏覽器application-a參觀,這裏是我所看到的:

enter image description here

&hellip;並在Tomcat日誌上看到:

No session was present - new one created with JSESSIONID=[A227B147A4027B7C37D31A4A62104DA9] 

到目前爲止這麼好。當我再訪問application-b這裏是我所看到的:

enter image description here

&hellip;和Tomcat的日誌顯示:

No session was present - new one created with JSESSIONID=[5DC8554459233F726628875E22D57AD5] 

這也是很好的解釋herein this answer我引述:

SRV.7.3會話範圍

的HttpSession對象必須在確定範圍應用程序(或servlet 上下文)級別。基礎機制(例如用於建立會話的cookie)對於不同的上下文可以是相同的,但包含該對象中的屬性的對象引用(包括該對象中的屬性)決不能由容器在上下文之間共享。

因此,即使在請求JSESSIONID cookie的存在,我的應用程序(一個部署在application-b)無法找到一個HttpSession對象在自己的servlet上下文範圍等新的會話對象的創建併爲JSESSIONID cookie分配了一個新值。

然而,當我現在回到我application-a我發現,因爲配置的Cookie路徑/價值的,現在正試圖使用​​JSESSIONID值設置由application-b,當然它的servlet沒有找到這樣的會話對象在自己的上下文中(application-a),所以創建了一個JSESSIONID cookie的新值,這將繼而使應用程序的會話無效等等等等,因爲我在兩者之間來回切換應用。

所以我的問題是:

1給出的上述行爲它似乎不可能兩個應用程序使用相同的JSESSIONID cookie值爲重點,以各自的HttpSession對象。所以實際上,不僅HttpSession對象總是不同,並且在應用程序(servlet上下文)級別有作用,而且在實踐中,JSESSIONID值必須不同。那是對的嗎?

2如果是這樣,那麼爲什麼Servlet規範使用的措辭:

的基本機制,如用於建立 會話cookie的,可以爲不同的上下文[同... ]

我能想象上面可以實現的唯一方法是有辦法hardcodedly提供JSESSIONID值創建一個新的會話對象時使用?但我沒有看到一個API。

3有沒有我可以有一些其他的餅乾用在<會話配置> XML元素/路徑應用程序之間共享,但沒有/路徑的方式應用到JSESSIONID餅乾嗎?換句話說,< session-config >是否適用於應用程序的所有cookie或僅用於會話跟蹤的cookie? (JSESSIONID)?

回答

1

在進一步的實驗,並採取了線索,從this answer它會出現對同一JSESSIONID用於所有Web應用程序,有必要設置的context.xml以下屬性:

<Context ... sessionCookiePath="/"> 

無論是 Tomcat範圍的context.xml WAR特定的context.xml將會執行。在WAR的web.xml中配置的<cookie-config><path>值顯然被忽略。所以在這一點上,儘管我已經解決了這個問題,但我仍然不清楚<cooke-config><path>元素應該爲什麼服務。

關於點我的問題我的已經發現,設置路徑爲其它餅乾的方法是通過編程創建許多,每個路徑,並與addCookie方法添加它們在響應對象。 web.xmlcontext.xml中的配置適用於會話cookie之外的其他cookie。