Spring Boot 使用 Spring Security 后无法 POST 提交数据解决方法
2017-05-03 13:02
911 查看
【问题描述】
项目使用的是 spring-boot + spring-security,页面用了 thymeleaf 模板
页面代码如下:
本该很简单的一个提交,然而点击 Submit 后出错:
提示缺少 “_csrf” 参数或 'X-CSRF-TOKEN' 头部。
【原因】
使用了 spring-security 后,默认开启了防止跨域攻击的功能,任何 POST 提交到后台的表单都要验证是否带有 _csrf 参数,一旦传来的 _csrf 参数不正确,服务器便返回 403 错误;
解决方法一:form 表单中添加 _csrf 隐藏域
解决方法二:form 表单使用 th:form 属性, thymeleaf 会自动在
form 表单中生成 _csrf 隐藏域;
解决方法三:关闭防跨域攻击功能,使用 http.csrf().disable():
【总结】
个人比较推荐方法二;
方法一需要手动在 form 表单中添加 _csrf 隐藏域,比较麻烦,个人并不怎么推荐;
方法三有点儿简单粗暴,如果网站没必要防止跨域攻击的,可以直接用方法三;
项目使用的是 spring-boot + spring-security,页面用了 thymeleaf 模板
页面代码如下:
<form method="post" action="/login"> username: <input type="text" name="userName" /> <br /> password: <input type="password" name="password" /> <br /> <button type="submit">Submit</button> </form>登录操作代码:
/** * 登录操作; * * @param userName 用户名; * @param password 密码; * @param modelMap * @param session * @return */ @RequestMapping(value = "/login", method = RequestMethod.POST) public String doLogin(@RequestParam(value = "userName", required = true) String userName, @RequestParam(value = "password", required = true) String password, ModelMap modelMap, HttpSession session) { // 登录处理逻辑(此处省去); }登录页面
本该很简单的一个提交,然而点击 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; /** * Created by Shawearn on 4/24/2017. */ @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 { // 代码省略... } }
【总结】
个人比较推荐方法二;
方法一需要手动在 form 表单中添加 _csrf 隐藏域,比较麻烦,个人并不怎么推荐;
方法三有点儿简单粗暴,如果网站没必要防止跨域攻击的,可以直接用方法三;
相关文章推荐
- php中使用Curl、socket、file_get_contents三种方法POST提交数据
- asp下对POST提交数据限制的解决方法
- 使用Curl、socket、file_get_contents三种方法POST提交数据
- 使用Curl、socket、file_get_contents三种方法POST提交数据
- dotnet 使用HttpWebRequest向Https Post数据时,需要证书确认的解决方法
- python使用post提交数据到远程url的方法
- sharepoint 2010 列表的数据表视图无法使用 the list cannot be displayed in datasheet view 解决方法
- 关于在用curl函数post网页数据时,遇上表单提交 type为submit 类型而且没有name和id时可能遇到的问题及其解决方法
- C#使用DataAdapter.Update(dt)方法,无法批量插入数据的原因及解决
- 使用HibernateTemplate持久化数据无法进入数据库的解决方法
- 使用Curl、socket、file_get_contents三种方法POST提交数据
- WebBrowser使用POST方法提交数据
- php中使用Curl、socket、file_get_contents三种方法POST提交数据
- 『PHP』UTF8编码页面存入GBK数据时使用iconv遇到无法转码的字符时中断内容丢失及解决方法
- jQuery使用post方法提交数据实例
- 使用sql server management studio 2008 无法查看数据库,提示 无法为该请求检索数据 错误916解决方法
- PHP使用$_POST传递数据并检验输出时弹出CSS代码的解决方法
- Python模仿POST提交HTTP数据及使用Cookie值的方法
- 使用Curl、socket、file_get_contents三种方法POST提交数据
- C++使用POST方法向网页提交数据-----C++发送HTTP数据获取Google天气预报