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

Mar*_*ker 6 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);
}
Run Code Online (Sandbox Code Playgroud)

我发现这是参考 https://jira.springsource.org/browse/SPR-3328?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel 说明响应编码只能在请求时设置编码被强制设置.为什么?

马丁,提前谢谢

Nan*_*ale 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>
Run Code Online (Sandbox Code Playgroud)

编辑:

CharacterEncodingFilter:即使在HTML页面或表单中指定,当前浏览器通常也不会设置字符编码.如果请求尚未指定编码,则上述过滤器可以应用其编码,或者在任何情况下强制执行此过滤器的编码("forceEncoding"="true").如果我们严格要编码字符,我们强行设置它.

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

我认为评论中的Boris's 链接会回答这些问题.