Spring 4 HttpSession对于每个控制器方法都不同

时间:2018-05-29 17:51:45

标签: spring spring-mvc spring-boot

说我有两个控制器:

@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上运行它。

1 个答案:

答案 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。