2012-07-27 7 views
6

Ich habe mir den von Spring MVC zur Verfügung gestellten CharacterEncodingFilter angeschaut. Ich habe mich gefragt, warum es nur möglich war, die Antwortcodierung festzulegen, wenn die Anfragecodierung zur angegebenen Codierung gezwungen wurde? Warum können Sie keine standardmäßige Antwortcodierung festlegen, wenn in den Felder für die Akzeptieren-Kopfzeile nichts angegeben ist? Oder wenn in der Anfrage keine Kodierung vorhanden war?Spring MVC: CharacterEncodingFilter; Warum setzt man nur response-kodierung?

Der Code:

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

Ich fand diese als Referenz https://jira.springsource.org/browse/SPR-3328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel besagt, dass die Antwort Codierung kann nur eingestellt werden, wenn die Anforderung Codierung gewaltsam eingestellt ist. Warum?

Vielen Dank im Voraus, Martin

+1

Möglicherweise ist es im Zusammenhang mit http://stackoverflow.com/questions/3616359/who-sets-response-content-type -in-spring-mvc-responsebody (wenn ich etwas nicht vermisse) –

Antwort

5

Ich kann Ihnen sagen, was Jürgen Höller sagt über Link https://jira.springsource.org/browse/SPR-3328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel,

Fügen Sie die folgenden Filter in web.xml (Servlets 2.4+) Codierung zu setzen:

<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 Bei rent-Browsern wird in der Regel keine Zeichencodierung festgelegt, selbst wenn dies in der HTML-Seite oder im HTML-Formular angegeben ist. Der obige Filter kann entweder seine Codierung anwenden, wenn die Anforderung nicht bereits eine Codierung angibt, oder die Codierung dieses Filters in jedem Fall erzwingen ("forceEncoding" = "true"). Wenn wir unbedingt Zeichen kodieren wollen, setzen wir sie zwangsweise.

  1. , warum es nur möglich war, die Antwort Codierung einzustellen, wenn die Anforderung Codierung an die angegebene Codierung gezwungen wurde?
  2. Warum nicht in der Lage sein, eine Standardantwortcodierung festzulegen, wenn in den Feldern für die Accept-Header nichts angegeben ist? Oder wenn in der Anfrage keine Kodierung vorhanden war?

Ich denke, Boris'slink in Kommentar wird diese Fragen beantworten.

+0

Danke für deine Antwort. Dies wird aber auch die Verschlüsselung der Anfrage erzwingen. Ich möchte wissen, warum sie die Anfragecodierung erzwingen, um die Antwortcodierung festzulegen. –

+0

@MartinBecker: aktualisierte Antwort, ich hoffe es klärt dich. –

+0

in Tomcat 6 wird es nicht funktionieren..was zu tun? –

0

Wenn nichts anderes funktioniert, können Sie in der Datei security-Context.xml einen Filter (Bean) erstellen und 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> 

Sie die neuen benutzerdefinierte-Filter setzen nicht vergessen:

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