2012-01-29 18 views
7

Tengo una aplicación bastante simple JSP/Servlet 3.0/Spring MVC 3.1.Cómo cambiar la codificación de caracteres para los formularios de carga de varias partes de Servlet 3.0 Spring MVC?

En una de mis páginas, tengo varios formularios. Una de estas formas le permite al usuario cargar un archivo y así se configura con enctype="multipart/form-data". Configuré la carga multiparte en el archivo web.xml con el elemento multipart-config que está disponible desde Servlet 3.0, combinado con <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/> en mi configuración de primavera.

También tengo configurado el org.springframework.web.filter.CharacterEncodingFilter de Spring.

El problema que tengo es que no puedo encontrar la manera de establecer la codificación predeterminada de StandardServletMultipartResolver en UTF-8, lo que a menudo hace que el contenido de los campos de texto en el formulario de varias partes se distorsione.

¿Hay alguna manera de arreglar esto?

Gracias de antemano.

Web.xml config:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
version="3.0"> 
<display-name>foo-web</display-name> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     WEB-INF\applicationContext.xml 
    </param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>foo</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>0</load-on-startup> 
    <multipart-config> 
     <max-file-size>52428800</max-file-size> 
     <file-size-threshold>5242880</file-size-threshold> 
    </multipart-config> 
</servlet> 
<servlet-mapping> 
    <servlet-name>foo</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-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> 
</filter> 
<filter-mapping> 
    <filter-name>CharacterEncodingFilter</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> 
<welcome-file-list> 
    <welcome-file>login</welcome-file> 
</welcome-file-list> 

+0

Yo también estoy enfrentando el problema ... le parecen la solución a este problema? – hanumant

+0

Sí Terminé volcando la configuración de Servlet 3.0 y seguí el enfoque normal de carga compartida, como se explica aquí [enlace] (http://static.springsource.org/spring/docs/current/spring-framework-reference/html/ mvc.html # mvc-multipart) – Mopper

Respuesta

10

Dado que no he encontrado ninguna manera de establecer la codificación predeterminada utilizando el StandardMultipartResolver, me tiró el config servlet 3.0 y se fue por el bien de edad CommonsMultipartResolver.

de haberla configurado como esto en mi contexto servlet primavera:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
    <!-- one of the properties available; the maximum file size in bytes --> 
    <property name="maxUploadSize" value="157286400" /> 
    <property name="maxInMemorySize" value="5242880"/> 
    <property name="defaultEncoding" value="utf-8"/> 
</bean> 

Al final, no hay mucha diferencia, ya que bajo el capó del StandardMultipartResolver, sólo los delegados a CommonsMultipartResolver.

De hecho, encuentro que el enfoque de servlet 3.0 es más problemático, ya que requiere configuración tanto en web.xml como en su contexto de servlet, y se pierde la capacidad de establecer la codificación predeterminada.

1

También tuve el problema con la codificación al usar la API de Servlet 3. Después de algunas investigaciones, descubrí que hay un error en Tomcat 7 que hace que los parámetros no se lean con la codificación correcta bajo ciertas condiciones. Hay una solución alternativa. En primer lugar, es necesario saber qué codificación de lo que realmente es (si no es por defecto iso-8859-1):

request.setCharacterEncoding("UTF-8"); 

Esto es básicamente lo que el CharacterEncodingFilter en la primavera hace. Nada extraño hasta ahora. Ahora el truco. Llame a este:

request.getParameterNames() 

asegurarse de que este método se invoca antes de getParts(). Si está utilizando Spring supongo que debe hacer esto en un filtro antes de que la solicitud termine en Spring. El orden en que se invocan los métodos es crucial.

Actualización: ElTomcat bug has been fixed en 7.0.41 en adelante, así que si usa una versión reciente de Tomcat sólo tiene que establecer la codificación de caracteres para obtener un resultado correcto.

1

he creado mi propio filtro de varias partes como holmis83 sugirió, y funcionó bien

public class MyMultiPartFilter extends MultipartFilter { 

    Logger logger = LoggerFactory.getLogger(MyMultiPartFilter.class); 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, 
      HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 

     request.setCharacterEncoding("UTF-8"); 
     request.getParameterNames(); 

     super.doFilterInternal(request, response, filterChain); 
    } 
} 
+0

Funciona para corregir la codificación de la página en el servidor Tomcat que tiene un problema, supongo que funciona en mi caso pero para el archivo de varias partes La corrección de Mopper es la correcta. Gracias – gasser

Cuestiones relacionadas