项目使用的是 spring-boot + spring-security,页面用了 thymeleaf 模板。
本该很简单的一个提交,然而点击 Submit 后出错:
提示缺少 “_csrf” 参数或 'X-CSRF-TOKEN' 头部。
【原因】 使用了 spring-security 后,默认开启了防止跨域攻击的功能,任何 POST 提交到后台的表单都要验证是否带有 _csrf 参数,一旦传来的 _csrf 参数不正确,服务器便返回 403 错误;
解决方法一:form 表单中添加 _csrf 隐藏域 <form method="post" action="/login"> username: <input type="text" name="userName" /> <br /> password: <input type="password" name="password" /> <br /> <!-- 添加隐藏域 --> <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/> <button type="submit">Submit</button> </form> 以上代码相对之前代码,添加了 <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/> 做为提交到后台的 _csrf 值;
解决方法二(推荐使用):form 表单使用 th:form 属性, thymeleaf 会自动在 form 表单中生成 _csrf 隐藏域; <form method="post" th:action="@{/login}"> username: <input type="text" name="userName" /> <br /> password: <input type="password" name="password" /> <br /> <button type="submit">Submit</button> </form>
解决方法三:关闭防跨域攻击功能,使用 http.csrf().disable(): package com.shawearn.blog.security; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration @EnableWebSecurity public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); // 省略其他代码; } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { // 代码省略... } }
摘抄 |