何时将@sessionattribute用于@modeldattribute

3htmauhk  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(330)

我很难弄清楚一个人会在什么时候 @SessionAttribute 结束 @ModelAttribute .
这个问题之所以出现,是因为在制作了一个web应用程序之后,我意识到我已经得到了很多方法 Principal principal 到。在这些方法中,我使用 principal.getName() 获取登录用户的用户名,然后使用该用户名从数据库检索相关数据。简而言之,我的很多方法都需要访问当前的用户数据,我认为这是一种低效的方式。
为了纠正这个问题,我打算在一个用注解的类中创建一个model属性 @ControllerAdvice ,其中我从数据库中获取主体和用户数据,并将其添加到模型中。
例如 model.addAttribute("currentUser", currentUser); 所以在这些方法的参数列表中 (@ModelAttribute("currentUser") UserAccount currentUser) 通过获取主体然后继续从数据库中获取用户来节省不必要的工作。
虽然我不太了解 @SessionAttribute ,我觉得像这样 data(UserAccount currentUser) 与模型相比,与会话更相关。我错了吗?
我也听说了 @SessionAttribute 不会使其数据在多个控制器之间可用,在这种情况下,我需要。所以我用 @ControllerAdvice .
我的问题如下:
在我需要重复访问当前用户数据的情况下,实现上述功能的最佳实践是什么。也许我可以通过在登录时添加一个当前用户bean,然后使用 @Autowired 这样我就不需要 currentUser 在参数列表中。但我不知道这是否可能。它是?
用注解的方法是真的吗 @ModelAttribute 在每个 @RequestMapping , @GetMapping , @PostMapping 等等。打电话?一个特定于 @SessionAttribute 在会话期间保留在模型中?
我应该在什么情况下使用 @SessionAttribute 结束 @ModelAttribute ?

yhxst69z

yhxst69z1#

这个 @SessionAttrributes 注解适用于需要在多个屏幕上访问模型属性的用例。就像为购物车结账一样,你会把 Order 在会话中,屏幕1,确认,屏幕2付款详细信息,屏幕3,交货详细信息,屏幕4确定。在屏幕4之后,您将调用 SessionStatus.setComplete() 它将清除该属性。
这就是 @SessionAttributes 并且应该与 @ModelAttribute . 它并不打算用于存储会话期间会话中的用户 HttpSession .
这个 @SessionAttribute (另一个注解!)是从 HttpSession 那是早些时候放在那里的。在身份验证之后的情况下,您将 UserHttpSessionHttpSession.setAttribute("currentUser", user); . 在控制器方法中,可以使用 @SessionAttribute("currentUser") User user 检索和使用它。不需要一个 @ControllerAdvice 或者模型属性。
不过,我强烈建议您放弃自定义安全性实现,改用Spring Security 之类的东西。这样,所有这些,以及更多,都已经是现成的了。在控制器方法中,可以使用 @AuthenticationPrincipal 用于检索当前用户的注解。

相关问题