我喜欢新的模板引擎 JTE,我正在努力学习它。
我知道我可以手动添加 CSRF 令牌作为请求属性,并且我已经为我的登录表单完成了此操作,如下所示:
@GetMapping("/login")
public String login(Model model, CsrfToken token) {
model.addAttribute("csrf", token.getToken());
return "auth/login";
}
@param String title
@param String csrf
@template.main-layout(title = title, content = @`
<form action="/login" method="POST">
<div>
<input type="text" name="username" placeholder="Username: ">
</div>
<div>
<input type="password" name="password" placeholder="Username: ">
</div>
<div>
<input type="hidden" name="_csrf" value="${csrf}">
</div>
<div>
<input type="submit" value="Log in" />
</div>
</form>
`)
但是在我的虚拟项目的主布局文件中,我想要一个条件,基本上检查用户是否经过身份验证,如果是,我想显示一个注销按钮,否则显示一个登录链接。
现在,我不想将 CSRF 令牌作为每个视图的 @param 传递,这会很烦人,
有没有好的方法可以直接在模板中实现这个?
否则我很高兴学习如何为开源做出贡献并尝试构建它, 或者我可能只需要学习百里香,因为我认为它具有开箱即用的功能
到目前为止我发现的最好的方法是使用@ControllerAdvice
import org.springframework.security.web.csrf.CsrfToken;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
@ControllerAdvice
public class JteControllerAdvice {
@ModelAttribute
public void csrf(Model model, CsrfToken csrf) {
model.addAttribute("_csrf", csrf);
}
}
您还可以使用@ControllerAdvice仅针对特定控制器。