2012-07-27 13 views
6

Stavo dando un'occhiata al CharacterEncodingFilter fornito da Spring MVC. Mi chiedevo perché era possibile impostare la codifica della risposta solo quando la codifica della richiesta era forzata alla codifica data? Perché non essere in grado di impostare una codifica di risposta predefinita se non viene specificato nulla nei campi dell'intestazione di accettazione? O se non fosse presente alcuna codifica nella richiesta?Spring MVC: CharacterEncodingFilter; perché impostare la codifica della risposta solo con la forza?

Il codice:

@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); 
} 

Ho trovato questo come riferimento https://jira.springsource.org/browse/SPR-3328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel affermando che la codifica di risposta può essere impostato solo quando la codifica richiesta viene forzatamente impostata. Perché?

Grazie in anticipo, Martin

+1

forse è in relazione con http://stackoverflow.com/questions/3616359/who-sets-response-content-type -in-spring-mvc-responsebody (se non mi manca qualcosa) –

risposta

5

posso dirvi quello che dice Juergen Hoeller sul collegamento https://jira.springsource.org/browse/SPR-3328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel,

Add seguente filtro in web.xml (Servlet 2.4 +) per impostare la codifica:

<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 in genere i browser non impostano una codifica dei caratteri, anche se specificata nella pagina o nel modulo HTML. Il filtro sopra può applicare la sua codifica se la richiesta non specifica già una codifica, o applicare la codifica di questo filtro in ogni caso ("forceEncoding" = "true"). Se vogliamo assolutamente codificare i caratteri, lo impostiamo forzatamente.

  1. il motivo per cui è stato possibile solo per impostare la codifica di risposta quando la codifica richiesta è stata costretta alla codifica dato?
  2. Perché non essere in grado di impostare una codifica di risposta predefinita se non viene specificato nulla nei campi dell'intestazione di accettazione? O se non fosse presente alcuna codifica nella richiesta?

penso Boris'slink in commento risponderà a queste domande.

+0

Grazie per la risposta. Ma questo forzerà anche la codifica sulla richiesta. Voglio sapere perché impongono la codifica della richiesta da impostare per impostare la codifica della risposta. –

+0

@ MartinBecker: risposta aggiornata, spero che ti chiarisca. –

+0

in Tomcat 6 non funzionerà ... cosa fare? –

0

Se non funziona niente, è possibile creare un filtro (bean) in security-Context.xml e impostare 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> 

Non dimenticare di impostare il nuovo custom-Filter:

<security:custom-filter ref="characterEncodingFilter" after="FIRST"/> 
Problemi correlati