CharacterEncodingFilter使用

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

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

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

7.8.      String alreadyFilteredAttributeName = getAlreadyFilteredAttributeName();

9.      if (request.getAttribute(alreadyFilteredAttributeName) != null || shouldNotFilter(httpRequest)) {

10.11.           filterChain.doFilter(request, response);

12.      }

13.      else {

14.           request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE);

15.       try {

16.            doFilterInternal(httpRequest, httpResponse, filterChain);

17.           }

18.       finally {

19.20.            request.removeAttribute(alreadyFilteredAttributeName);

21.           }

22.      }

23. }

24.25.public static final String ALREADY_FILTERED_SUFFIX = ".FILTERED";(在OncePerRequestFilter中定义的常量)

26.说明:

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.4.         if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {

5.                request.setCharacterEncoding(this.encoding);

6.               if (this.forceEncoding && responseSetCharacterEncodingAvailable) {

7.                    response.setCharacterEncoding(this.encoding);

8.                   }

9.              }

10.              filterChain.doFilter(request, response);

11.  }

12.13.private final static boolean responseSetCharacterEncodingAvailable = ClassUtils.hasMethod(

14.   HttpServletResponse.class, "setCharacterEncoding", new Class[] {String.class});

15.说明:

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.4.         if (this.forceEncoding || request.getCharacterEncoding() == null) {

5.                   request.setCharacterEncoding(this.encoding);

6.              }

7.              filterChain.doFilter(request, response);

8.  }

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

总结:

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

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

时间: 2024-11-07 04:05:32

CharacterEncodingFilter使用的相关文章

characterEncodingFilter作用

package com.demo.test; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.Serv

Spring MVC过滤器-字符集过滤器(CharacterEncodingFilter)

spring的字符集过滤通过用于处理项目中的乱码问题,该过滤器位于org.springframework.web.filter包中,指向类CharacterEncodingFilter,CharacterEncodingFilter源代码如下: [java] view plain copy /* * Copyright 2002-2007 the original author or authors. * * Licensed under the Apache License, Version 

详解Spring中的CharacterEncodingFilter

在项目中有很多让人头疼的问题,其中,编码问题位列其一,那么在Spring框架中是如何解决从页面传来的字符串的编码问题的呢?下面我们来看看Spring框架给我们提供过滤器CharacterEncodingFilter 1.看清结构: 可以看到其继承GenericFilterBean和OncePerRequestFilter,也就是说,这个过滤器就是针对于每次浏览器请求进行过滤的,然后再其之上添加了父类没有的功能即处理字符编码. 2.官方解释: Servlet 2.3/2.4 Filter that

java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast

严重: Exception starting filter encodingFilterjava.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filterat org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConf

【Filter】CharacterEncodingFilter解决JavaWeb项目POST提交造成的中文乱码

import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public cla

web.xml/servlet过滤器之引入CharacterEncodingFilter

配置CharacterEncodingFilter过滤器,你可以强制将请求或者相应设置成utf-8,规避乱码的风险. <filter>  <filter-name>SetCharacterEncoding</filter-name>  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  <init-param>   &

Spring CharacterEncodingFilter

web项目使用spring时,可以使用Spring提供的字符集过滤filter,非常方便对于有中文的字符设置 <!-- 设置请求编码格式为UTF-8 --> <filter> <filter-name>springEncoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <i

CharacterEncodingFilter类的学习

web.xml内代码: <!-- 字符集过滤器 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class><span style="color:#ff0000;">org.springframework.web.filter.CharacterEncodingFilter</span></filter

Spring字符集过滤器CharacterEncodingFilter(转)

Spring中的字符集过滤器可以很方便的为我们解决项目中出现的中文乱码问题,而且使用方法也很简单,只需要在web.xml文件中配置一下该过滤器,设置两个重要的参数(encoding和forceEncoding)即可: Xml代码 <!-- 配置请求过滤器 ,编码格式设为UTF-8,避免中文乱码--> <filter> <filter-name>springUtf8Encoding</filter-name> <filter-class>org.s