Spring和Thymeleaf会话属性
问题描述:
我正在创建我的第一个Spring博客,并尝试在导航栏中设置记录的用户全名。不幸的是,sec:authentication =“name”给了我用户的电子邮件,$ {user.fullname)不会呈现任何东西。我想在文章控制器中加入以下代码:Spring和Thymeleaf会话属性
@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";
}
它起作用了。不过,我想在任何地方使用它,现在我只能在“/”中使用它。请咨询我如何修改代码,以便能够在所有模板中使用用户名。
答
您应该创建一个注释类为@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);
}
}
感谢您的答案,遗憾的问题,我应该在控制器文件夹中创建@ControllerAdvice为一个新文件或者我应该在控制器中添加呢? –
我想通了,非常感谢你!问题已解决 –
很高兴你知道,我是afk。你能接受答案吗? –