这个问题与此网址上的问题有关 Spring Security 3.2 CSRF对多部分请求的支持
我尝试了这个完全相同的设置以及要点,但我不能让它工作,除非我在网址中有_csrf令牌.我在表单主体中将它作为隐藏字段并在安全过滤器之前指定了过滤器,但没有任何欢乐,并且每次都使用无效csrf令牌的调试日志消息失败
任何有关这方面的帮助将不胜感激
干杯达米恩
没有要点就很难找到,但我终于明白了!
实际上它与Spring安全性无关.真正的问题只出在SpringFramework多部分配置中.但正因为如此,请求似乎根本没有参数(既不是_csrf
,也不是file
),并且第一个检测它是CsrfFilter
.我删除了有关安全性的所有内容,错误是Requested parameter file absent
(或类似的东西......)
如Spring Framework手册中所述,multipart可以通过两种方式处理:
使用Apache commons fileupload
使用servlet 3.0配置
您遵循相关帖子的第一个解决方案,并配置CommonsMultipartResolver
在mvc-dispatcher-servlet.xml
.第一个问题是它MultipartFilter
与全局ServletContext相关,并MultipartResolver
在根应用程序上下文中查找它而不是在servlet特定的上下文中.
第二个问题是你忘了在你的Apache中添加一个依赖Apache commons fileupload pom.xml
.
所以你必须首先在你的.中添加这种依赖性 pom.xml
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
接下来,您必须filterMultipartResolver
从中删除bean mvc-dispatcher-servlet.xml
并在根应用程序上下文中声明它.作为快速而肮脏的修复,您可以将其添加到spring-security.xml
:
<beans:bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <beans:property name="maxUploadSize" value="100000000" /> </beans:bean>
另一种配置是使用servlet 3.0的多部分处理.无需依赖apache commons fileupload,也不需要将任何bean添加到配置中,因为MultipartFilter
使用StandardServletMultipartResolver
默认值.
你只需要添加一个<multipart-config>
在声明元素DispatcherServlet
在web.xml
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <multipart-config> <!--location>/tmp</location--> <max-file-size>1000000</max-file-size> </multipart-config> </servlet>