Spring MVC:CharacterEncodingFilter;为什么只强制设置响应编码?

时间:2012-07-27 10:05:59

标签: java spring character-encoding

我正在查看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 说明只有在强制设置请求编码时才能设置响应编码。为什么呢?

提前致谢, 马丁

2 个答案:

答案 0 :(得分:5)

我可以告诉你Juergen Hoeller在链接https://jira.springsource.org/browse/SPR-3328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel上说了什么,

在web.xml(Servlet 2.4+)中添加以下过滤器以设置编码:

<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页面或表单中指定,当前浏览器通常也不会设置字符编码。如果请求尚未指定编码,则上述过滤器可以应用其编码,或者在任何情况下强制执行此过滤器的编码(“forceEncoding”=“true”)。如果我们严格要编码字符,我们会强行设置它。

  
      
  1. 为什么只有在请求编码被强制为给定编码时才能设置响应编码?
  2.   
  3. 如果在接受标题字段中未指定任何内容,为什么不能设置默认响应编码?或者,如果请求中没有编码?
  4.   

我认为评论中的Boris's link会回答这些问题。

答案 1 :(得分: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"/>