我遇到了一个问题,即当请求来自域名而不是本地主机时,会话变量不可用。例如,如果我设置一个用户变量:
request.getSession(true).setAttribute("user", user);
//Redirects to another html page or something...
当客户端提出另一个请求,而我尝试访问用户会话变量时,它返回null。
//Client makes another request to the server
request.getSession(true).getAttribute("user"); //returns null
我注意到,对于每个请求,都会设置一个新的JSESSIONID cookie,并且ID值会更改。这是否意味着每次客户端访问服务器时都会创建一个新会话?如何在客户端之间维护相同的会话,以便可以将对象存储在HttpSession中并可以访问它们?
我不知道这是否与任何事情有关,但是从雄猫管理器查看应用程序时,无论我是在同一浏览器窗口中使用该应用程序,还是不刷新该应用程序,会话数都继续增长。页面或其他任何内容。是否有另一个迹象表明正在对服务器的每个请求上创建一个新会话?
仅当从域名ex.example.com/app访问应用程序时才会发生这种情况。来自本地主机时,会话变量可以正常工作。
更新资料
我没有使用response.sendRedirect进行测试,并且会话变量在切换页面并向服务器发出另一个请求之前一直可用。这证实了我的怀疑,即每个请求都将创建一个新会话。它不是重定向那杀死会话,也不是任何新请求。我该如何预防?
问题出在JSESSIONID cookie中的路径上。我仍然不知道为什么将其设置为tomcat应用程序路径/ tomcat-app-name /,但是我将web.xml中的cookie配置更改为:
<session-config>
<cookie-config>
<name>JSESSIONID</name>
<path>/</path>
<http-only>true</http-only>
<secure>true</secure>
</cookie-config>
</session-config>
现在,会话变量可以跨会话工作。当然,现在使用本地主机运行时,会话变量不起作用。相反,您可以在context.xml根上下文节点上设置sessionCookiePath:
我正在使用ubuntu服务器和tomcat7。对于tomcat7,可以在/etc/tomcat7/context.xml中找到context.xml。
<Context ... sessionCookiePath="/" > ... </Context>
现在,您不必在应用程序web.xml中配置JSESSIONID cookie,就应该能够在本地运行(如果您没有在本地计算机上更改该cookiepath)以及在服务器上运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句