Spring 4 HttpSession对于每个控制器方法都是不同的
假设我有两个控制器:Spring 4 HttpSession对于每个控制器方法都是不同的,spring,spring-mvc,spring-boot,Spring,Spring Mvc,Spring Boot,假设我有两个控制器: @Controller public class SetUserController { @PostMapping("/setUser") public setUser( @RequestBody User user, HttpSession session) { session.setAttribute("user", user); return "index"; } } 在GetUserController#getUser方法中,会
@Controller
public class SetUserController
{
@PostMapping("/setUser")
public setUser( @RequestBody User user, HttpSession session)
{
session.setAttribute("user", user);
return "index";
}
}
在GetUserController#getUser方法中,会话是一个全新的会话(isNew=true,并且它具有不同的ID),因此显然session.getAttribute()将始终返回null。DispatcherServlet是否为每个请求创建新的HttpSession对象?如果是的话。。。为什么
我在Tomcat 8上运行这个 检查路径JSSessionID 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>
现在会话变量正在跨会话工作。当然,现在会话变量在使用localhost运行时不起作用。相反,您可以在context.xml根上下文节点上设置sessionCookiePath:
我正在使用ubuntu服务器和tomcat8。对于tomcat8,context.xml可以在/etc/tomcat8/context.xml中找到
现在,您应该能够在本地(如果您没有更改本地计算机上的cookiepath)和服务器上运行,而无需在apps web.xml中配置JSESSIONID cookie。首先,dispatcher servlet不会为每个请求创建新会话。您是在传入有效的用户对象的情况下首先点击setUser URL的吗?您看到的是在第一个响应中设置的JSESSIONID cookie,并在第二个对getUser的请求中返回?有一个索引页首先被命中。点击索引页时会创建一个JSESSIONID cookie。如果我在setUser和getUser方法中创建一个断点,那么HttpSession对象的ID对于这两个方法都是不同的,并且isNew被设置为true,因此有些东西正在为每个请求创建一个新的HttpSession对象。上面的代码只是一个例子,是的,假设用户对象是有效的。这些会话不会仅仅来自上面的代码。要么JSESSIONID cookie没有被返回(比如如果它只安全,不在https上),要么其他一些代码使会话无效。
<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