Spring上传时报Invalid CSRF Token错误解决方案

概述

使用spring security之后,默认上传文件会报这个错,解决方案有下面两个:

解决方案一: 将 MultipartFilter 放在 springSecurityFilterChain 前面

修改web.xml文件:


    <filter>
        <filter-name>MultipartFilterfilter-name>
        <filter-class>org.springframework.web.multipart.support.MultipartFilterfilter-class>
    filter>
    <filter-mapping>
       <filter-name>MultipartFilterfilter-name>
       <url-pattern>/*url-pattern>
    filter-mapping>

    
   <filter>
     <filter-name>springSecurityFilterChainfilter-name>
     <filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
   filter>

   <filter-mapping>
    <filter-name>springSecurityFilterChainfilter-name>
    <url-pattern>/*url-pattern>
   filter-mapping>

只要文件上传过滤器放在spring security 的过滤器前就好了。

这样配置之后,任何用户都可以上传临时文件到服务器,但是,只有认证用户才可以提交表单。因为临时文件对服务器影响不大(除了大规模上传),所以,这样配置大多数情况下都是安全的。spring 官方也推荐这样配置。

解决方案二:在form的action属性里加上 CSRF token

修改上传文件的form:

"/fileupload?${_csrf.parameterName}=${_csrf.token}" method="post" commandName="goods"  enctype="multipart/form-data">
                   ...                
 

可见,上面就增加了${_csrf.parameterName}=${_csrf.token},但是这种方法会泄露参数,因为这样配置之后,上面这个参数直接就是可见的。更多信息参考:RFC 2616 Section 15.1.3 Encoding Sensitive Information in URI’s.

参考文档


16.5.4 Multipart (file upload)

你可能感兴趣的:(spring)