带有 / 和JSESSIONID的cookie
我正在尝试在我的应用程序的web.xml中设置cookie路径(如此处所示 ):
/
因此,我将两个相同的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
,这就是我所看到的:
…在我读到的Tomcat日志上:
No session was present - new one created with JSESSIONID=[A227B147A4027B7C37D31A4A62104DA9]
到现在为止还挺好。 当我访问application-b
这就是我所看到的:
…和Tomcat日志显示:
No session was present - new one created with JSESSIONID=[5DC8554459233F726628875E22D57AD5]
这也很好,正如这里所解释的, 在这个答案和我引用:
SRV.7.3会话范围
HttpSession对象必须在应用程序(或servlet上下文)级别设置范围。 底层机制(例如用于建立会话的cookie)对于不同的上下文可以是相同的,但引用的对象(包括该对象中的属性)决不能由容器在上下文之间共享。
因此,即使在请求中存在JSESSIONID
cookie,我的应用程序(部署在application-b
中的application-b
)也无法在其自己的servlet上下文范围中找到HttpSession对象,因此创建了一个新的会话对象并分配了一个新值到JSESSIONID
cookie。
但是,当我现在回到我的application-a
我发现由于为cookie路径配置了/
value,它现在尝试使用application-b
设置的JSESSIONID
值,当然它的servlet找不到这样一个会话对象在它自己的上下文( application-a
)中,因此创建了一个JSESSIONID
cookie的新值,这将反过来使application-b
应用程序的会话无效等等,因为我切换回来时无穷无尽两个申请之间。
所以我的问题是:
1鉴于上述行为,两个应用程序似乎不可能使用相同的JSESSIONID
cookie值作为其各自HttpSession对象的键。 事实上,不仅HttpSession对象总是不同并且在应用程序(servlet上下文)级别作用域,而且实际上, JSESSIONID
值必须不同。 那是对的吗?
2如果是这样,那么为什么servlet规范使用了措辞:
底层机制,例如用于建立会话的cookie,对于不同的上下文可以是相同的[…]
我可以想象上面唯一可以实现的方法是有一种方法可以硬编码地提供在创建新会话对象时使用的JSESSIONID
值吗? 但我没有看到API。
3我是否可以使用 XML元素中的/
path在应用程序之间共享其他cookie,但不能将/
path应用于JSESSIONID
cookie? 换句话说,是应用于应用程序的所有cookie还是仅适用于会话跟踪的cookie? ( JSESSIONID
)?
经过进一步的实验并从这个答案中得到一个提示,似乎对于所有Web应用程序使用相同的JSESSIONID,有必要在context.xml中设置以下属性:
Tomcat范围的context.xml 或特定于WAR的context.xml都可以。 显然忽略了WAR的web.xml中配置的
值。
关于我的问题的第3点,我发现为其他cookie设置路径的方法是以编程方式创建其中的许多路径,每个路径一个,并使用addCookie方法将它们添加到响应对象中。 web.xml
或context.xml
中的配置适用于会话cookie之外的其他cookie。