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