【问题标题】:HttpSession changes after closing the browser关闭浏览器后 HttpSession 发生变化
【发布时间】:2019-07-22 13:08:16
【问题描述】:

我正在空闲时间创建一个 Spring Boot 应用程序,目前我正在使用会话来跟踪登录用户。 我遇到的问题是,每次我关闭浏览器并再次打开它时,我的会话都会过期(ID 更改),我必须再次登录。

这是我使用会话的简单代码:

@GetMapping("/explore")
public String explore(HttpSession session){
    //This prints different results after closing the browser
    System.out.println(session.getId());
    if(session.getAttribute("user") != null) {
        thisUser = (User) session.getAttribute("user");
    }
    return "explore";
}

我像这样将用户对象添加到会话中(为简单起见省略了验证):

@PostMapping("/login")
public String logging(User user, HttpSession session){
        session.setAttribute("user", user);
        return "redirect:/explore";
}

【问题讨论】:

    标签: java spring spring-boot spring-mvc session


    【解决方案1】:

    这符合指定的行为。会话 cookie 没有年龄,因此只要客户端打开了 webbrowser 实例,或者客户端没有访问服务器端的会话超时设置中指定的时间,它就会一直存在。

    您基本上想要一个比会话 cookie 寿命更长的 cookie。您可以使用 Cookie API 创建一个新的长寿命 cookie,使用 Cookie#setMaxAge() 设置其年龄,使用 HttpServletResponse#addCookie() 将其添加到 HTTP 响应中。在随后的 HTTP 请求中,您可以使用 HttpServletRequest#getCookies() 确定 cookie 的存在。

    【讨论】:

      【解决方案2】:

      使用 Cookie。 Cookie 是存储在客户端的一小段数据,服务器在与客户端通信时使用它。

      Cookie authCookie = new Cookie("AUTH", user.getUserName());
      authCookie.setMaxAge(60*60);
      response.addCookie(authCookie);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-03
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 2020-08-25
        • 1970-01-01
        相关资源
        最近更新 更多