6

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

在此先感谢,马丁

4

2 回答 2

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. 如果在接受头字段中没有指定任何内容,为什么不能设置默认响应编码?或者如果请求中没有编码?

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

于 2012-07-27T10:18:32.210 回答
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"/>
于 2016-07-12T18:10:59.030 回答