概述
使用spring security之后,默认上传文件会报这个错,解决方案有下面两个:
解决方案一: 将 MultipartFilter 放在 springSecurityFilterChain 前面
修改web.xml文件:
<!-- 文件上传过滤器,过滤上传请求不经过spring security --><filter><filter-name>MultipartFilter</filter-name><filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class></filter><filter-mapping><filter-name>MultipartFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- spring security 配置 --><filter><filter-name>springSecurityFilterChain</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping><filter-name>springSecurityFilterChain</filter-name><url-pattern>/*</url-pattern></filter-mapping>
只要文件上传过滤器放在spring security 的过滤器前就好了。
这样配置之后,任何用户都可以上传临时文件到服务器,但是,只有认证用户才可以提交表单。因为临时文件对服务器影响不大(除了大规模上传),所以,这样配置大多数情况下都是安全的。spring 官方也推荐这样配置。
解决方案二:在form的action属性里加上 CSRF token
修改上传文件的form:
<form:form action="/fileupload?${_csrf.parameterName}=${_csrf.token}" method="post" commandName="goods" enctype="multipart/form-data">... </form:form>
可见,上面就增加了${_csrf.parameterName}=${_csrf.token}
,但是这种方法会泄露参数,因为这样配置之后,上面这个参数直接就是可见的。更多信息参考:RFC 2616 Section 15.1.3 Encoding Sensitive Information in URI’s.
参考文档
16.5.4 Multipart (file upload)