Spring和Thymeleaf会话属性

时间:2017-04-22 21:18:39

标签: java spring thymeleaf

我正在创建我的第一个Spring博客并尝试在导航栏中设置已记录的用户全名。不幸的是,sec:authentication =" name"给我用户电子邮件和$ {user.fullname)不呈现任何内容。我想在文章控制器中放入以下代码

 @GetMapping("/")
public String index(Model model) {
    List<Article> articles = this.articleRepository.findAll();

   Object currentUser = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

   if ("anonymousUser".equals(currentUser.toString())) {
       model.addAttribute("username","GUEST");
   } else {
       UserDetails user = (UserDetails) currentUser;
       String name = this.userRepository.findByEmail(user.getUsername()).getFullName();
       model.addAttribute("username",name);
   }

    model.addAttribute("view", "home/index");
    model.addAttribute("articles", articles);

    return "base-layout";
}

它有效。但是我想在任何地方使用它,现在我只能在&#34; /&#34;中使用它。请告知我如何修改代码,这样我就可以在所有模板中使用用户名。

1 个答案:

答案 0 :(得分:1)

您应该创建一个使用@ControllerAdvice注释的类,该类指示带注释的类可以帮助您Controller。然后创建一个方法@ModelAttribute,它将设置由所有(或大多数)控制器共享的公共属性。

例如:

@ControllerAdvice
public class UserControllerAdvice {

  @ModelAttribute
  public void addUserAttribute() {

   Object currentUser = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

   if ("anonymousUser".equals(currentUser.toString())) {
       model.addAttribute("username","GUEST");
   } else {
       UserDetails user = (UserDetails) currentUser;
       String name = this.userRepository.findByEmail(user.getUsername()).getFullName();
       model.addAttribute("username",name);
   }
}