如何使春季会议在多个请求中持久存在?

时间:2019-09-07 11:09:15

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

我正在使用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

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

谢谢。

2 个答案:

答案 0 :(得分:2)

@Frank,当您通过邮递员提出请求时,它始终被视为新请求。

在使用spring会话和spring安全性时,spring在成功登录后创建新会话。

代替从Postman测试应用程序,而是部署,运行,测试和分析应用程序。

它肯定会帮助您发现问题。

答案 1 :(得分:0)

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

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

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

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