2012-07-27 14 views
6

Estaba echando un vistazo al CharacterEncodingFilter provisto por Spring MVC. Me preguntaba por qué solo era posible configurar la codificación de respuesta cuando la codificación de solicitud se forzaba a la codificación dada. ¿Por qué no ser capaz de establecer una codificación de respuesta predeterminada si no se especifica nada en los campos del encabezado de aceptación? O si no hay codificación presente en la solicitud?Spring MVC: CharacterEncodingFilter; ¿por qué solo establecer la codificación de respuesta por la fuerza?

El código:

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

    if (this.encoding != null && (this.forceEncoding 
     || request.getCharacterEncoding() == null)) { 

    request.setCharacterEncoding(this.encoding); 
    if (this.forceEncoding) { 
     response.setCharacterEncoding(this.encoding); 
    } 
    } 
    filterChain.doFilter(request, response); 
} 

He encontrado esto como referencia https://jira.springsource.org/browse/SPR-3328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel que indica que la codificación de la respuesta sólo se puede ajustar cuando la solicitud de codificación se establece por la fuerza. ¿Por qué?

Gracias de antemano, Martin

+1

Posiblemente está relacionado con http://stackoverflow.com/questions/3616359/who-sets-response-content-type -in-spring-mvc-responsebody (si no me falta algo) –

Respuesta

5

te puedo decir lo que dice Juergen Holler en el enlace https://jira.springsource.org/browse/SPR-3328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel,

Agregar siguiente filtro en web.xml (Servlet 2.4+) para establecer la codificación:

<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> 

EDIT:

CharacterEncodingFilter: Cu Los navegadores rrent normalmente no establecen una codificación de caracteres, incluso si se especifica en la página o formulario HTML. El filtro anterior puede aplicar su codificación si la solicitud aún no especifica una codificación, o hacer cumplir la codificación de este filtro en cualquier caso ("forceEncoding" = "true"). Si estrictamente queremos codificar caracteres, lo configuramos a la fuerza.

  1. por lo que sólo fue posible establecer la codificación de respuesta cuando la solicitud de codificación se vio obligado a la codificación dada?
  2. ¿Por qué no se puede establecer una codificación de respuesta predeterminada si no se especifica nada en los campos del encabezado de aceptación? O si no hay codificación presente en la solicitud?

creo Boris'slink en el comentario responderá a estas preguntas.

+0

Gracias por su respuesta. Pero esto también forzará la codificación en la solicitud. Quiero saber por qué obligan a establecer la codificación de solicitud para establecer la codificación de respuesta. –

+0

@MartinBecker: respuesta actualizada, espero que te aclare. –

+0

en tomcat 6 no funcionará ... ¿qué hacer? –

0

Si nada funciona, puede crear un filtro (bean) en security-Context.xml y establecer forceEnconding = true;

<bean id="characterEncodingFilter" class="org.springframework.web.filter.CharacterEncodingFilter"> 
    <property name="encoding" value="utf-8"></property> 
    <property name="forceEncoding" value="true"></property> 
</bean> 

No se olvide de establecer la nueva medida Filtro:

<security:custom-filter ref="characterEncodingFilter" after="FIRST"/> 
Cuestiones relacionadas