Spring 何时在@ModelAttribute上使用@SessionAttribute
我很难计算出一个特定的时间,在这个时间里人们会使用Spring 何时在@ModelAttribute上使用@SessionAttribute,spring,spring-mvc,Spring,Spring Mvc,我很难计算出一个特定的时间,在这个时间里人们会使用@SessionAttribute而不是@modeldattribute 出现这个问题是因为在制作了一个web应用程序之后,我意识到我已经得到了很多方法,这些方法都是我在Principal中传递给的。在这些方法中,我使用principal.getName()获取登录用户的用户名,然后使用该用户名从数据库检索相关数据。简而言之,我的很多方法都需要访问当前的用户数据,我以我认为效率低下的方式解决了这个问题 为了纠正这个问题,我打算在一个用@Contr
@SessionAttribute
而不是@modeldattribute
出现这个问题是因为在制作了一个web应用程序之后,我意识到我已经得到了很多方法,这些方法都是我在Principal
中传递给的。在这些方法中,我使用principal.getName()
获取登录用户的用户名,然后使用该用户名从数据库检索相关数据。简而言之,我的很多方法都需要访问当前的用户数据,我以我认为效率低下的方式解决了这个问题
为了纠正这个问题,我打算在一个用@ControllerAdvice
注释的类中创建一个model属性,在这个类中,我从数据库中获取主体和用户数据,并将其添加到模型中
例如model.addAttribute(“currentUser”,currentUser)代码>
因此,在这些方法的参数列表中,我可以有(@modeldattribute(“currentUser”)UserAccount currentUser)
通过获取主体,然后继续从数据库获取用户,从而节省不必要的工作
虽然我对@SessionAttribute
了解不多,但我觉得这种数据(UserAccount currentUser)
与模型相比,与会话更相关。我错了吗
我还听说,@SessionAttribute
不能跨多个控制器提供其数据,在这种情况下,我需要这些数据。因此我使用@ControllerAdvice
我的问题如下:
在我需要的地方,实现上述目标的最佳实践是什么
重复访问当前用户的数据。也许我可以通过在登录时添加一个当前用户bean,然后使用@Autowired
来进一步提高效率,这样我甚至不需要在参数列表中包含currentUser
。但我不知道这是否可能。是吗
调用了用@modeldattribute
注释的方法,这是真的吗
在每次调用@RequestMapping
、@GetMapping
、@PostMapping
等之前?
特定于@SessionAttribute
的对象保留在
会话期间的模型
另外,在什么情况下我应该使用用户@SessionAttribute
结束
@modeldattribute
注释适用于需要在多个屏幕上访问的模型属性的用例。就像为购物车结账一样,您将在会话中存储订单
,屏幕1,确认,屏幕2付款详细信息,屏幕3,交货详细信息,屏幕4确定。在屏幕4之后,您将调用,它将清除该属性
这就是@SessionAttributes
的用例,并且应该与@modeldattribute
结合使用。它不用于在HttpSession
期间存储会话中的用户等
(另一个注释!)是从前面放置的HttpSession
中检索属性。在身份验证后的情况下,您将使用HttpSession.setAttribute(“currentUser”,User)将User
放置在HttpSession
中代码>。在控制器方法中,您可以使用@SessionAttribute(“currentUser”)用户
检索并使用它。不再需要@ControllerAdvice
或model属性
但是,我强烈希望放弃您的自定义安全实现,改用类似的方式。通过这种方式,所有这些,以及更多,都已经开箱即用。在控制器方法中,您可以使用@AuthenticationPrincipal
注释检索当前用户