Java Spring引导-在控制器方法之间保存用户
在我的控制器方法中,避免重复相同的userService DB查找的最佳方法是什么 我正在使用Spring Boot 1.5.2和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
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不是在谈论代码重复,而是在某个地方存储一些东西,以便减少往返数据库的次数。