2011-03-26 12 views
9

Tengo un problema al usar mvc de primavera y caracteres especiales en una solicitud GET. Considere el siguiente método:Obtener codificación de parámetros

@RequestMapping("/update") 
public Object testMethod(@RequestParam String name) throws IOException { 
    } 

a la que enviar una solicitud GET con nombre que contiene una "A" (diéresis alemán), por ejemplo. Resulta que la primavera recibe "ä" porque el navegador asigna "ä" al %C3%A4.

Entonces, ¿cómo puedo obtener la secuencia codificada correcta de mi controlador?

Gracias por su ayuda!

+1

cómo se codifica la dirección URL? Aquí solo hay una codificación estándar: utf-8,% -encoded según sea necesario. – bmargulies

+0

La URL de solicitud está codificada como '...% C3% A4' – Erik

Respuesta

7

¿Qué tal esto? Podría ayudar?

En su Web.xml:

<filter> 
     <filter-name>CharacterEncodingFilter</filter-name> 
     <filter-class>com.example.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> 
     <servlet-name>dispatcher</servlet-name> 
    </filter-mapping> 

com.example.CharacterEncodingFilter:

public class CharacterEncodingFilter implements Filter { 

    protected String encoding; 

    public void init(FilterConfig filterConfig) throws ServletException { 
     encoding = filterConfig.getInitParameter("encoding"); 
    } 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 
      FilterChain filterChain) throws IOException, ServletException { 

     HttpServletRequest request = (HttpServletRequest) servletRequest; 
     request.setCharacterEncoding(encoding); 

     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    public void destroy() { 
     encoding = null; 
    } 

} 
+2

Ya he probado el filtro org.springframework.web.filter.CharacterEncodingFilter que viene con la primavera y hace lo que usted describe. Desafortunadamente sin un resultado. – Erik

+0

Muy extraño ... No puedo imaginar qué más podría ser. – Rihards

+1

Quizás los datos provenientes del navegador * no sean utf-8 * porque la página de formulario * no es utf-8 *. – bmargulies

41

Usted está teniendo este problema, porque la solicitud diferencia entre cuerpo y codificación URI codificación Un CharacterEncodingFilter establece la codificación del cuerpo, pero no la codificación URI.

Debe configurar URIEncoding = "UTF-8" como un atributo en todos sus conectores en su servidor Tomcat.xml. Vea aquí: http://tomcat.apache.org/tomcat-6.0-doc/config/ajp.html

O, como alternativa, puede establecer useBodyEncodingForURI = "True".

Si está usando el plugin Tomcat experto, sólo tiene que añadir este parámetro:

mvn -Dmaven.tomcat.uriEncoding = UTF-8 Tomcat: Ejecutar

+1

Estoy usando Tomcat directamente sin un conector. ¿Puede la solución que describió aún funcionar? – Erik

+1

Esta respuesta me ha ahorrado mucho tiempo, ¡gracias! – olan

+0

Buen punto aquí. – onigunn

Cuestiones relacionadas