【问题标题】:How to make spring session persistent throughout multiple requests?如何使春季会话在多个请求中持续存在?
【发布时间】:2019-09-07 11:09:15
【问题描述】:

我正在使用 Spring Boot 和 Angular 开发一个 Web 应用程序(在后台我也使用 Spring Session、Security 和 Data Jpa)。我遇到了会话问题。似乎 spring 正在为每个请求创建一个新的会话实例(我检查了会话 ID)。我的问题是,有什么办法可以防止这种情况发生吗?我想在会话中存储值并在整个请求中保持它们的持久性。

这不会发生在只有 spring-boot-starter-web 依赖项的新项目中。

这是我的控制器显示问题:

@PostMapping("/set_item")
public void setItem(HttpSession session, @RequestParam String item) {
    System.out.println("Session Id " + session.getId());
    System.out.println("Item " + item);
    session.setAttribute("item", item);
    System.out.println("Session Item " + session.getAttribute("item"));
}

@GetMapping("/get_item")
public Object getItem(HttpSession session) {
    System.out.println("Session Id " + session.getId());
    System.out.println("Session Attribute " + 
    session.getAttribute("item"));
    return session.getAttribute("item");
}

当我在“http://localhost:8181/set_item?item=Banana”上使用 POSTMAN 发出请求时 我在控制台中得到的是

Session Id 424dda79-f7b1-4818-8bcc-d371b4a1b7d5
Item Banana
Session Item Banana

所以我们可以看到属性设置正确。

当我对“http://localhost:8181/get_item”发出 GET 请求时,我的控制台日志

Session Id e04f0de2-d7d2-4827-9652-3f6232b27c3f
Session Attribute null

因此,创建了一个新实例。

提前谢谢你。

【问题讨论】:

  • 你能在浏览器中确认这个行为吗?

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


【解决方案1】:

@Frank,当您通过 Postman 发出请求时,它总是将其视为新请求。

使用spring session和spring security时,登录成功后spring会创建新的session。

不是从 Postman 测试应用程序,而是部署应用程序、运行它、测试它并分析它。

它肯定会帮助您识别问题。

【讨论】:

  • 谢谢!现在一切都成了场面。由于我之前使用 Postman 的基本身份验证,因此 spring 每次都创建一个新的会话实例。现在我使用 Angular 发送请求,应用程序按预期工作!
【解决方案2】:

如果 item 是您想要存储在会话中的值,那么您可以使用 Spring 的 @SessionAttributes

假设您的控制器看起来相似:

@Controller
@SessionAttributes("item")
@RequestMapping("/item")
public class ItemController {
...
}

这篇文章可能对Maintain model data between sessions有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2011-10-29
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    相关资源
    最近更新 更多