文档章节

org.springframework.web.filter.CharacterEncodingFilter

随智阔
 随智阔
发布于 2014/04/02 21:56
字数 943
阅读 78
收藏 0

感谢:http://blog.csdn.net/heidan2006/article/details/3075730

很简单很实用的一个过滤器,当前台JSP页面和JAVA代码中使用了不同的字符集进行编码的时候就会出现表单提交的数据或者上传/下载中文名称文件出现乱码的问题,那这个类就可以出场了。

        从名字就可以看出来它是个过滤器了,所以就要想配置普通过滤器那样配置到web.xml中去了,配置方式如下:

  1.         <filter>
  2.                 <filter-name>encodingFilter</filter-name>
  3.                     <filter-class>
  4. org.springframework.web.filter.CharacterEncodingFilter
  5.                     </filter-class>
  6.                 <init-param>
  7.                     <param-name>encoding</param-name>
  8.                     <param-value>UTF-8</param-value>
  9.                 </init-param>
  10. <init-param>
  11.                     <param-name>forceEncoding</param-name>
  12.                     <param-value>false</param-value>
  13.                </init-param>
  14.         </filter>
  15.         <filter-mapping>
  16.                 <filter-name>encodingFilter</filter-name>
  17.                 <url-pattern>/*</url-pattern>
  18.        </filter-mapping>

        和普通过滤器配置没什么区别,就是多了两个初始化参数,两个参数的作用分别是:

    encoding----->用来指定一个具体的字符集

    forceEncoding------->Spring的早期版本这个参数作用很单一,当request中已经被指定了一个字符集的时候是否再将用endcoding对应的字符集设置到request中去。举个例子来说明,假如说过滤器就像上面那样被配置到web.xml了,当请求被提交之后,过滤器会判断request.getCharacterEncoding()是否为null,如果是null那么就会进行request.setCharacterEncoding("UTF-8")的操作,如果不是null那么过滤器什么也不会做。

    不过Spring目前得版本这个类的代码已经被重构了,代码更加“漂亮”了,这个参数的作用也发生了细微的改变。

    为了加深印象从源码来分析一下这个参数的变化。

    首先,说明 一下CharacterEncodingFilter是继承OncePerRequestFilter抽象类而来的,OncePerRequestFilter实现了doFilter方法:

  1. public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
  2.    throws ServletException, IOException {
  3.          ...........
  4.          ...........
  5.       String alreadyFilteredAttributeName = getAlreadyFilteredAttributeName();
  6. if (request.getAttribute(alreadyFilteredAttributeName) != null || shouldNotFilter(httpRequest)) {
  7.            filterChain.doFilter(request, response);
  8.       }
  9. else {
  10.            request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE);
  11. try {
  12.             doFilterInternal(httpRequest, httpResponse, filterChain);
  13.            }
  14. finally {
  15.             request.removeAttribute(alreadyFilteredAttributeName);
  16.            }
  17.       }
  18. }
  19. public static final String ALREADY_FILTERED_SUFFIX = ".FILTERED";(在OncePerRequestFilter中定义的常量)

说明:

1. getAlreadyFilteredAttributeName()方法返回的字符串是="我们给filter配置的名字+ALREADY_FILTERED_SUFFIX",所以request请求第一次到达过滤器的时候request.getAttribute(alreadyFilteredAttributeName) 值一定是null ,shouldNotFilter(httpRequest)方法默认实现始终返回false(这个方法也可以在子类中进行扩展);

2. 当request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE)之后就会执行doFilterInternal(httpRequest, httpResponse, filterChain);方法了,doFilterInternal这里是个抽象方法,它是在子类CharacterEncodingFilter中被实现的,实现如下:

  1. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
  2.    throws ServletException, IOException {
  3. if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
  4.                 request.setCharacterEncoding(this.encoding);
  5. if (this.forceEncoding && responseSetCharacterEncodingAvailable) {
  6.                     response.setCharacterEncoding(this.encoding);
  7.                    }
  8.               }
  9.               filterChain.doFilter(request, response);
  10.   }
  11. private final static boolean responseSetCharacterEncodingAvailable = ClassUtils.hasMethod(
  12.    HttpServletResponse.class, "setCharacterEncoding", new Class[] {String.class});

说明:

1. 静态常量responseSetCharacterEncodingAvailable 是通过反射来判断response是否有setCharacterEncoding方法,返回值应该都是true.

2. this.encoding != null :当encoding初始化参数被指定时条件满足。

3. (this.forceEncoding || request.getCharacterEncoding() == null )==true:当forceEncoding初始化参数设置为true或者request已经被指定了一个字符编码的时候条件满足。

如果没记得错,Spring早期版本这个方法得实现应该是:

  1. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
  2.    throws ServletException, IOException {
  3. if (this.forceEncoding || request.getCharacterEncoding() == null) {
  4.                    request.setCharacterEncoding(this.encoding);
  5.               }
  6.               filterChain.doFilter(request, response);
  7.   }

参数forceEncoding的作用很明显了吧!以前只是对request字符编码起作用,现在如果将forceEncoding设为true也会影响到response中的字符编码,通常这个是我们不希望的。

总结:

1.  OncePerRequestFilter这个抽象过滤器很好的实现了对每个request只执行一次过滤操作,如果有类似的需求可以继承该类并实现doFilterInternal方法来完成。

2.  CharacterEncodingFilter类可以通过简单配置来帮我们实现字符集转换的功能。另外多说一句,如果采用Struts2.0的MVC框架我个人感觉中文问题已经不是问题了,可以通过配置struts.i18n.encoding常量来实现统一字符编码。

© 著作权归作者所有

随智阔
粉丝 21
博文 687
码字总数 705350
作品 0
海淀
程序员
私信 提问
eclipse下我装了springsource tool suite插件,然后没有提示啊?

eclipse下我装了springsource tool suite插件,不显示提示啊。 比如说 org.springframework.web.filter.CharacterEncodingFilter 我输入org. 会有一个提示。 这个功能怎么配置? 多谢~...

半步不多行
2015/08/01
336
0
Java 中文引号乱码

前端form提交信息到java后台, 中文单双引号变成乱码,用了org.springframework.web.filter.CharacterEncodingFilter utf-8仍不行,还有个奇怪的地方用jetty没乱码,换tomcat就乱码...

john_sz
2014/06/26
693
10
springmvc ajax响应乱码

springmvc响应ajax请求中文乱码 已设置org.springframework.web.filter.CharacterEncodingFilter为UTF-8 文件地址,大神帮看看:http://pan.baidu.com/s/1hqACENU index.jsp请求UserControl......

yybray
2014/10/08
4.6K
23
websphere部署时报500

websphere日志中报[Servlet Error]-[/login.jsp]: java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter incompatible with javax.servlet.Filter有高手知......

嵇智
2014/05/22
236
1
thymeleaf解决中文乱码

在web.xml加了过滤器也是无法解决的 需要在spring的配置文件中加入thymeleaf 视图解析器的编码,如:

菜鸟一直在成长
2016/06/17
443
0

没有更多内容

加载失败,请刷新页面

加载更多

JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
27分钟前
4
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
46分钟前
5
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
47分钟前
5
0
HTML5+CSS3从入门到精通 中文pdf版​

本文转载于:专业的前端网站➵HTML5+CSS3从入门到精通 中文pdf版 HTML5+CSS3从入门到精通是通过基础知识+中小实例+综合案例的方式,讲述了用HTML5+ CSS3设计构建网站的必备知识,相对于专业指...

前端老手
50分钟前
6
0
聊聊nacos client的ConfigFilterChainManager

序 本文主要研究一下nacos client的ConfigFilterChainManager IConfigFilterChain nacos-1.1.3/api/src/main/java/com/alibaba/nacos/api/config/filter/IConfigFilterChain.java public in......

go4it
56分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部