我在我的應用程序的web.xml設置Cookie路徑(如建議here)來嘗試:餅乾<path>/</path>和JSESSIONID
<session-config>
<cookie-config>
<path>/</path>
</cookie-config>
</session-config>
於是我分別兩個相同的Web應用程序部署到localhost:8080/application-a
和localhost: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
參觀,這裏是我所看到的:
&hellip;並在Tomcat日誌上看到:
No session was present - new one created with JSESSIONID=[A227B147A4027B7C37D31A4A62104DA9]
到目前爲止這麼好。當我再訪問application-b
這裏是我所看到的:
&hellip;和Tomcat的日誌顯示:
No session was present - new one created with JSESSIONID=[5DC8554459233F726628875E22D57AD5]
這也是很好的解釋here也in 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)?