Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 4 HttpSession对于每个控制器方法都是不同的_Spring_Spring Mvc_Spring Boot - Fatal编程技术网

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