说我有两个控制器:
@Controller
public class SetUserController
{
@PostMapping("/setUser")
public setUser( @RequestBody User user, HttpSession session)
{
session.setAttribute("user", user);
return "index";
}
}
...
@Controller
public class GetUserController
{
@GetMapping("/getUser")
public getUser( HttpSession session)
{
User user = (User)session.getAttribute("user");
return "index";
}
}
在GetUserController#getUser方法中,会话是一个全新的会话(isNew = true且它具有不同的ID),因此显然session.getAttribute()将始终返回null。调度程序servlet是否为每个请求创建一个新的HttpSession对象?如果是这样......为什么?!
我在Tomcat 8上运行它。
答案 0 :(得分:0)
检查路径JSESSIONID cookie或重定向方式。
或者尝试像这样配置你的cookie。
如果你有web.xml
<session-config>
<cookie-config>
<name>JSESSIONID</name>
<path>/</path>
<http-only>true</http-only>
<secure>true</secure>
</cookie-config>
</session-config>
如果你使用弹簧靴:
server.servlet.session.cookie.path= /
server.servlet.session.cookie.name= JSESSIONID
server.servlet.session.cookie.http-only= true
server.servlet.session.cookie.secure= true
现在会话变量正在跨会话工作。当然,现在会话变量在使用localhost运行时不起作用。相反,您可以在context.xml根上下文节点上设置sessionCookiePath:
我使用的是ubuntu服务器和tomcat8。对于tomcat8,可以在/etc/tomcat8/context.xml找到context.xml。
...
现在,您应该能够在本地运行(如果您没有在本地计算机上更改该cookie路径)以及在服务器上运行,而无需在应用程序web.xml中配置JSESSIONID cookie。