问题:
最近在学习 Spring Boot,实战的时候遇到了问题,就是添加了 spring-boot-starter-security 依赖后,使用 thymeleaf 提交表单后报 403 错误。
原因是:
添加上述依赖后,默认开启了防止跨域攻击的功能,任何 POST 提交到后台的表单都要验证是否带有 _csrf 参数,一旦传来的 _csrf 参数不正确,服务器便返回 403 错误;
解决方案:
1、比较常规的解决方案就是,在 form 表单中添加 th:action 属性, thymeleaf 会 自动在 form 表单中生成 _csrf 隐藏域,代码如下:
<form method="POST" th:action="@{/add}">...</form>
可以打开页面调试,在 Network 栏目下查看提交数据,可以观察到 Form Data 里面生产了 _csrf 数据。
2、还有比较直接的解决方案,就是在重写的 configure(HttpSecurity http) 方法中关闭防跨域攻击功能,不太推荐:
http.csrf().disable()
3、还有一种就是在 form 表单中手动添加隐藏 _csrf,比较麻烦,有兴趣的可以网上搜索一下具体做法。