在 Spring Security 团队的帮助下,我能够解决这个问题。我已更新 Gist 以反映工作配置。为了让一切按预期工作,我必须按照下面给出的步骤进行操作。
1.常用步骤
按照the answer by @holmis83 中的说明将MultipartFilter 添加到web.xml,确保在Spring Security 配置之前添加:
<filter>
<display-name>springMultipartFilter</display-name>
<filter-name>springMultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>springMultipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<display-name>springSecurityFilterChain</display-name>
<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>
<dispatcher>ERROR</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
2.1.使用 Apache Commons 多部分解析器
确保在根 Spring 应用程序上下文中存在一个名为 filterMultipartResolver 的 Apache Commons Multipart Resolver bean。我将再次强调这一点,确保 Multipart Resolver 在根 Spring Context 中声明(通常称为 applicationContext.xml)。例如,
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:springWebMultipartContext.xml
</param-value>
</context-param>
springWebMultipartContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000000" />
</bean>
</beans>
确保 bean 被称为 filterMultipartResolver,因为在 web.xml 中配置的 MultipartFilter 不会拾取任何其他 bean 名称。我的初始配置不起作用,因为这个 bean 被命名为 multipartResolver。我什至尝试使用 web.xml init-param 将 bean 名称传递给 MultipartFilter,但这也不起作用。
2.2.使用 Tomcat Multipart 支持
Tomcat 7.0+ 具有内置的多部分支持,但必须明确启用。如下更改全局 Tomcat context.xml 文件或在您的 WAR 文件中包含一个本地 context.xml 文件,以使此支持能够正常工作,而无需对您的应用程序进行任何其他更改。
<Context allowCasualMultipartParsing="true">
...
</Context>
在使用 Apache Commons Multipart Resolver 进行这些更改后,我们的应用程序目前在 Tomcat、Jetty 和 Weblogic 上运行。