2012-07-27 70 views
6

我正在看看Spring MVC提供的CharacterEncodingFilter。我想知道爲什麼只有在請求編碼被強制爲給定編碼時才能設置響應編碼?如果accept頭域中沒有指定任何內容,爲什麼不能設置默認的響應編碼?或者如果請求中沒有編碼?Spring MVC:CharacterEncodingFilter;爲什麼只強制設置響應編碼?

的代碼:

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

我發現這個作爲參考 https://jira.springsource.org/browse/SPR-3328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel 指出的是,當請求編碼被強制設置響應編碼只能設置。爲什麼?

由於提前, 馬丁

+1

可能它與http://stackoverflow.com/questions/3616359/who-sets-response-content-type相關-in-spring-mvc-responsebody(如果我沒有丟失東西) – 2012-07-27 10:10:48

回答

5

我可以告訴你什麼克林斯曼Hoeller說鏈路https://jira.springsource.org/browse/SPR-3328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel

在web.xml(2.4 + Servlet的)設置編碼

添加以下過濾器:

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

編輯:

CharacterEncodingFilter:銅即使在HTML頁面或表單中指定,rrent瀏覽器通常也不設置字符編碼。如果請求尚未指定編碼,則上述過濾器可以應用其編碼,或者在任何情況下強制執行此過濾器的編碼(「forceEncoding」=「true」)。如果我們嚴格要編碼字符,我們強行設置它。

  1. 爲什麼它是唯一可以設置響應編碼時,請求編碼被迫給定的編碼?
  2. 如果accept頭域中沒有指定任何內容,爲什麼不能設置默認的響應編碼?或者如果請求中沒有編碼?

我覺得Boris'slink的評論將回答這些問題。

+0

感謝您的回答。但是這也會強制請求上的編碼。我想知道他們爲什麼強制設置請求編碼以設置響應編碼。 – 2012-07-27 12:26:59

+0

@MartinBecker:更新的答案,我希望它能澄清你。 – 2012-07-27 13:46:15

+0

在tomcat 6它不會工作..怎麼辦? – 2016-03-30 11:06:10

0

如果沒有其他的工作,你可以在security-Context.xml中創建一個過濾器(bean)並設置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> 

不要忘記設置新的自定義過濾器:

<security:custom-filter ref="characterEncodingFilter" after="FIRST"/> 
相關問題