在使用 wangEdit 富文本编辑器的过程中,在测试上传图片时,一直显示上传失败。原因也很简单,post 方法的 /upload 一直是 404 ,使用 PostMan 测试也是,一直是 404 Not Found,根本进不了后台。甚至,换其他 post 请求的页面也是这样,搞半天没找到原因。但是,使用 form 表单发起 post 请求却能成功。
最终,找到了原因所在。
因为项目使用了 Spring Security,在配置文件里,开启了 CSRF (跨站请求伪造) 防护。
知道这个原因,就很容易解决问题了。
加一句
成功解决。
【原因】
使用了 spring-security 后,默认开启了防止跨域攻击的功能,任何 POST 提交到后台的表单都要验证是否带有 _csrf 参数,一旦传来的 _csrf 参数不正确,服务器便返回 403 错误;
解决方法一:form 表单中添加 _csrf 隐藏域
以上代码相对之前代码,添加了
做为提交到后台的 _csrf 值;
解决方法二:form 表单使用 th:action 属性, thymeleaf 会自动在 form 表单中生成 _csrf 隐藏域;
解决方法三:关闭防跨域攻击功能,使用 http.csrf().disable():
解决方法四:忽略指定请求的 CSRF 防护
【总结】
个人比较推荐方法二 和 方法四;
方法一需要手动在 form 表单中添加 _csrf 隐藏域,比较麻烦,个人并不怎么推荐;
方法三有点儿简单粗暴,如果网站没必要防止跨域攻击的,可以直接用方法三。
参考:http://blog.csdn.net/shawearn1027/article/details/71119587
最终,找到了原因所在。
因为项目使用了 Spring Security,在配置文件里,开启了 CSRF (跨站请求伪造) 防护。
知道这个原因,就很容易解决问题了。
加一句
- http.csrf().ignoringAntMatchers("/upload"); // 禁用 富文本编辑器上传图片 upload 的 CSRF 防护
成功解决。
关于开启 CSRF 防护后 POST 请求无法发起解决办法
【原因】
使用了 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:action 属性, 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():
- 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 {
- // 代码省略...
- }
- }
解决方法四:忽略指定请求的 CSRF 防护
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- //其他代码
- http.csrf().ignoringAntMatchers("/h2-console/**"); // 禁用 H2 控制台的 CSRF 防护
- http.csrf().ignoringAntMatchers("/upload"); // 禁用 富文本编辑器上传图片 upload 的 CSRF 防护
- }
【总结】
个人比较推荐方法二 和 方法四;
方法一需要手动在 form 表单中添加 _csrf 隐藏域,比较麻烦,个人并不怎么推荐;
方法三有点儿简单粗暴,如果网站没必要防止跨域攻击的,可以直接用方法三。
参考:http://blog.csdn.net/shawearn1027/article/details/71119587
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏