此问题与此网址上的问题有关 Spring Security 3.2 CSRF support for multipart requests
我尝试了这个完全相同的设置以及要点,但除非我在网址中有_csrf令牌,否则我无法使用它。我在表单主体中将它作为隐藏字段并在安全过滤器之前指定了过滤器,但没有任何欢乐,并且每次都使用无效csrf令牌的调试日志消息失败
非常感谢对此的任何帮助
干杯达米恩
答案 0 :(得分:7)
没有要点就很难找到,但我终于明白了!
实际上它与Spring安全无关。真正的问题只出在SpringFramework多部分配置中。但由于这个原因,请求似乎根本没有参数(_csrf
和file
),而第一个检测它的是CsrfFilter
。我删除了有关安全性的所有内容,错误是Requested parameter file absent
(或类似的内容......)
详见Spring Framework manual,可以通过两种方式处理多部分:
使用servlet 3.0配置
CommonsMultipartResolver
中配置了mvc-dispatcher-servlet.xml
。第一个问题是MultipartFilter
与全局ServletContext相关,并在根应用程序上下文中查找其MultipartResolver
,而不是在servlet特定的上下文中。第二个问题是你忘记在pom.xml
中添加对Apache commons fileupload的依赖。
因此,您必须先在pom.xml
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
接下来,您必须从filterMultipartResolver
中删除mvc-dispatcher-servlet.xml
bean并在根应用程序上下文中声明它。作为快速而肮脏的修复,您可以将其添加到spring-security.xml
:
<beans:bean id="filterMultipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="maxUploadSize" value="100000000" />
</beans: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>