Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 何时在@ModelAttribute上使用@SessionAttribute_Spring_Spring Mvc - Fatal编程技术网

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
    注释检索当前用户