如何使 spring 会话在多个请求中保持不变?
How to make spring session persistent throughout multiple requests?
我正在使用 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
因此,创建了一个新实例。
提前致谢。
@Frank,当你通过 Postman 发出请求时,它总是被视为一个新请求。
当您使用 spring 会话和 spring 安全性时,spring 在成功登录后创建新会话。
不是从 Postman 测试应用程序,而是部署应用程序,运行它,测试它并分析它。
一定能帮助您定位问题。
如果 item 是您想要存储在会话中的值,那么您可以使用 Spring 的 @SessionAttributes
假设您的控制器看起来很相似:
@Controller
@SessionAttributes("item")
@RequestMapping("/item")
public class ItemController {
...
}
这个 post 可能会有所帮助 Maintain model data between sessions
我正在使用 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
因此,创建了一个新实例。
提前致谢。
@Frank,当你通过 Postman 发出请求时,它总是被视为一个新请求。
当您使用 spring 会话和 spring 安全性时,spring 在成功登录后创建新会话。
不是从 Postman 测试应用程序,而是部署应用程序,运行它,测试它并分析它。
一定能帮助您定位问题。
如果 item 是您想要存储在会话中的值,那么您可以使用 Spring 的 @SessionAttributes
假设您的控制器看起来很相似:
@Controller
@SessionAttributes("item")
@RequestMapping("/item")
public class ItemController {
...
}
这个 post 可能会有所帮助 Maintain model data between sessions