MultipartConfig avec Servlet 3.0 sur Spring MVC
Comment puis-je ajouter dans plusieurs parties de la configuration spring mvc application qui utilise des contrôleurs avec les méthodes annotées avec RequestMapping?
De fond:
Je souhaite activer la protection csrf et ont donc ajouté à la sécurité:csrf balise dans mon printemps config. J'ai un contrôleur de classe avec une méthode annotée avec RequestMapping utilisé pour le téléchargement de fichiers. J'ai également suivi le mise en garde instructions autour multipart laquelle j'ai ajouté le multipart filtre au-dessus du filtre de sécurité. Quand j'ai essayé de télécharger un fichier après l'ajout de la csrf étiquette, je suis une exception autour d'un manque getParts() la méthode. Un rapide google mis en évidence ce phénomène était dû à l'utilisation d'une version de la jetée, qui était basée sur la servlet 2.5 spec. J'ai mis à jour la jetée-maven-plugin pour 8.1.14.v20131031 et essayé de télécharger à nouveau. Ce qui entraîne:
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: No multipart config for servlet
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:68)
at org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:58)
at org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:110)
Où dois-je mettre le multipart de configuration xml de configuration? L'ensemble de la documentation dit d'ajouter le multipart-config dans la balise servlet pour la servlet dans web.xml. Il n'y a qu'une seule servlet pour mon application. Donc je l'ai ajouté à cela et encore obtenir le même problème.
<servlet>
<servlet-name>SpringDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<multipart-config>
<location>/tmp</location>
<max-file-size>20848820</max-file-size>
<max-request-size>418018841</max-request-size>
<file-size-threshold>1048576</file-size-threshold>
</multipart-config>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/servlet-context.xml
</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
J'ai aussi mis à jour l'emplacement du schéma en haut de web.xml point à la version 3.0 de la servlet spec, provenant de http://www.mkyong.com/web-development/the-web-xml-deployment-descriptor-examples/.
Toute aide?
Edit: ajout de la riles pour Rob:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring/webapp.xml</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>OracleDB,common</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
<servlet>
<servlet-name>SpringDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<multipart-config>
<location>/tmp</location>
<max-file-size>20848820</max-file-size>
<max-request-size>418018841</max-request-size>
<file-size-threshold>1048576</file-size-threshold>
</multipart-config>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/servlet-context.xml
</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringDispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<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>
<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>
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>XSS</filter-name>
<filter-class>com.mycompany.CrossScriptingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XSS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>10</session-timeout>
</session-config>
<resource-ref>
<description>Core Datasource</description>
<res-ref-name>jdbc/coreDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<description>Location Datasource</description>
<res-ref-name>jdbc/locationDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<error-page>
<!-- Missing login -->
<error-code>401</error-code>
<location>/WEB-INF/views/errorPage.jsp</location>
</error-page>
<error-page>
<!-- Forbidden directory listing -->
<error-code>403</error-code>
<location>/WEB-INF/views/errorPage.jsp</location>
</error-page>
<error-page>
<!-- Missing resource -->
<error-code>404</error-code>
<location>/WEB-INF/views/errorPageNotFound.jsp</location>
</error-page>
<error-page>
<!-- Uncaught exception -->
<error-code>500</error-code>
<location>/WEB-INF/views/errorPage.jsp</location>
</error-page>
<error-page>
<!-- Unsupported servlet method -->
<error-code>503</error-code>
<location>/WEB-INF/views/errorPage.jsp</location>
</error-page>
</web-app>
servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd">
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" />
<mvc:resources mapping="/images/**" location="file:${fileSystemStore.fileSystemStorageLocation}"/>
<context:component-scan base-package="com.mycompany.console.*" />
<mvc:interceptors>
<bean class="com.mycompany.security.ChangePasswordInterceptor" />
</mvc:interceptors>
<security:global-method-security
secured-annotations="enabled" jsr250-annotations="enabled"
pre-post-annotations="enabled" proxy-target-class="true" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
<property name="contentType" value="text/html;charset=UTF-8" />
</bean>
<bean id="filterMultipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000000"/>
</bean>
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:language</value>
<value>classpath:language_additions</value>
<value>classpath:formats</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8" />
</bean>
<bean id="localeResolver" class="com.mycompany.locale.SessionLocaleResolver"/>
</beans>
OriginalL'auteur edwardmlyte | 2014-04-22
Vous devez vous connecter pour publier un commentaire.
Je crois que vous rencontrez des problèmes liés à SPR-11373. Plus précisément, la spécification servlet n'est pas clair sur ce qui doit se produire lors de l'exécution de plusieurs parties de la résolution à l'intérieur d'un Filtre.
Avez-vous essayé d'utiliser commons fileupload à la place? C'est probablement votre meilleure option. Tout d'abord ajouter la dépendance suivant:
À côté de vous assurer d'avoir la suite de haricot définition dans votre racine de contexte de l'application.
Vous pouvez trouver un travail complet exemple avec les deux communes-télécharger (préférer cette solution) et l'utilisation de tomcat à l'aide allowCasualMultipartParsing sur SEC-2471
Correction, je suis l'aide de la classe qui étend la CommonsMultipartResolver. Mais essayé avec juste la CMR directement, ce qui a abouti à la même erreur. (Question distincte: la mise en garde de la documentation sur csrf besoins de mise à jour comme il instruit à utiliser le "servlet-name" de la balise à l'intérieur de la multipart filtre mappage mais dans votre exemple, je vois que vous utilisez le bon "mappage d'url" tag.)
Vous vérifié que le haricot nom est le même nom et qui est présent dans la racine de contexte de l'application? Vous pouvez poster de configuration (w/ son nom de fichier) et l'ensemble de votre web.xml? Le problème dans les docs que vous avez mentionné était connecté en tant que jira.printemps.io/parcourir/SEC-2466 et doit être fixé 3.2.1.LIBÉRATION le Voir docs.printemps.io/printemps-sécurité/site/docs/3.2.x/de référence/...
Yup. Haricot nom à l'origine était juste multipartResolver j'ai donc essayé avec le nom mis à jour, toujours le même problème. J'ai ajouté les fichiers que vous avez demandé.
Le filterMultipartResolver bean doit être dans le contexte de la racine (pas la servlet). Essayez de déplacer le filterMultipartResolver bean /spring/webapp.xml
OriginalL'auteur Rob Winch