Java Spring引导-在控制器方法之间保存用户

Java Spring引导-在控制器方法之间保存用户,java,spring,spring-boot,Java,Spring,Spring Boot,在我的控制器方法中,避免重复相同的userService DB查找的最佳方法是什么 我正在使用Spring Boot 1.5.2和Spring Boot starter security以及Spring Boot starter thymeleaf进行模板化 我尝试为SecurityContextHolder.getContext().getAuthentication()添加一个实例变量,但它给了我一个NullPointerException @Controller public class

在我的控制器方法中,避免重复相同的userService DB查找的最佳方法是什么

我正在使用Spring Boot 1.5.2和
Spring Boot starter security
以及
Spring Boot starter thymeleaf
进行模板化

我尝试为
SecurityContextHolder.getContext().getAuthentication()
添加一个实例变量,但它给了我一个NullPointerException

@Controller
public class DashboardController {

    @Autowired
    private UserService userService;

    @Value("${product.name}")
    private String productName;


    @RequestMapping(value="/dashboard", method = RequestMethod.GET)
    public ModelAndView home() {
      ModelAndView modelAndView = new ModelAndView();
      Authentication auth = SecurityContextHolder.getContext().getAuthentication();
      User user = userService.findUserByEmail(auth.getName());

      modelAndView.addObject("email", user.getEmail());

      modelAndView.setViewName("dashboard");

      return modelAndView;
    }

    @RequestMapping(value="/dashboard/faq", method = RequestMethod.GET)
    public ModelAndView faq(){
      ModelAndView modelAndView = new ModelAndView();
      Authentication auth = SecurityContextHolder.getContext().getAuthentication();
      User user = userService.findUserByEmail(auth.getName());

      modelAndView.addObject("email", user.getEmail());
      modelAndView.addObject("productname", productName);

      modelAndView.setViewName("faq");

      return modelAndView;
   }

如果要获取存储在会话中的用户,可以使用以下注释:

@RequestMapping("/me")
public User me(@AuthenticationPrincipal User user) {
    return user;
}
如果您希望用户在thymeleaf中始终可用,我将使用
@ControllerAdvice

@ControllerAdvice(annotations = Controller.class)
public class GlobalVariablesControllerAdvice {

    @ModelAttribute("user")
    public User user() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();

        User user = null;
        // get user from authentication, but make sure to check for nulls

        return user;
    }

}

如果要获取存储在会话中的用户,可以使用以下注释:

@RequestMapping("/me")
public User me(@AuthenticationPrincipal User user) {
    return user;
}
如果您希望用户在thymeleaf中始终可用,我将使用
@ControllerAdvice

@ControllerAdvice(annotations = Controller.class)
public class GlobalVariablesControllerAdvice {

    @ModelAttribute("user")
    public User user() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();

        User user = null;
        // get user from authentication, but make sure to check for nulls

        return user;
    }

}

如果重复执行相同的操作,则可以A)创建控制器超类,B)创建servlet过滤器,或者C)创建Spring拦截器。在这种情况下,我会使用选项C。我宁愿使用选项d)提供自定义
HandlerMethodArgumentResolver
或。。。Spring Security,并将此类检查保留在你的控制器之外,但topic starter可能已经询问了会话和会话属性。我认为@A_B不是在谈论代码重复,而是在某个地方存储一些东西,以减少往返数据库的次数。如果你重复做同样的事情,A)创建控制器超类,B)创建servlet过滤器,或C)创建Spring拦截器。在这种情况下,我会使用选项C。我宁愿使用选项d)提供自定义
HandlerMethodArgumentResolver
或。。。Spring Security,并将此类检查保留在你的控制器之外,但主题启动者可能已经询问了会话和会话属性。我认为@A_B不是在谈论代码重复,而是在某个地方存储一些东西,以便减少往返数据库的次数。