Filter 解决web网页跳转乱码

为什么采用filter实现了字符集的统一编码

  问题:

  为什么会有字符集编码的问题呢?对于Java Web应用,使用Tomcat容器获取和传递的参数(request.getParameter())默认是iso8859-1编码格式,所以即使我们在页面统一使用中文编码GB2312,在request.getParameter()取得的参数仍会有乱码。

  因此我们要对Tomcat获取的参数进行编码转换,采用request.setCharacterEncoding()与response.setCharacterEncoding()会使得获取的参数与返回的结果和页面的(比如是GB2312)编码一致,这样就可以避免编码问题了。

  但是这样的话,问题又来了,比如我们现在有很多的servlet和jsp,每个文件都要取得参数,这样的话每个servlet和jsp都要写request.setCharacterEncoding()与response.setCharacterEncoding(),这样就有重复的代码,不简洁,这就需要用filter来帮忙了。

解决思路:

    Filter是一层接口,横切在请求与Tomcat容器之间,它可以设置请求传递的数据编码格式或者说Tomcat取得参数与返回结果的字符编码。这样在servlet和jsp中就不用再写重复的代码了,由filter设置。采用Filter必须要实现javax.servlet.Filter接口,一个filter代码如下:

 

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 class CharsetEncodingFilter implements Filter {  private String charEncode = null;

 public void destroy() {  }

 public void doFilter(ServletRequest servletRequest,    ServletResponse servletResponse, FilterChain filterChain)    throws IOException, ServletException {   servletRequest.setCharacterEncoding(charEncode);   filterChain.doFilter(servletRequest, servletResponse);  }

 public void init(FilterConfig filterConfig) throws ServletException {   this.charEncode = filterConfig.getInitParameter("charEncode");  }

}

 

 

  根据API,要实现其三个方法:init、doFilter、destroy,其核心是doFilter方法。该方法将拦截到的所有请求统一设置为指定的charEncode编码,然后将请求再发送下去,这样Tomcat得到的参数都是指定的编码格式了,也就实现了简化重复.

 

 

要想使用该filter,必须要配置该filter,就像servlet一样需要配置。其配置如下(在web.xml中):

 

<!-- 用于设置字符集的filter -->

<filter>
  <filter-name>CharsetEncodingFilter</filter-name>
  <filter-class>kane.CharsetEncodingFilter</filter-class>
  <init-param>
   <param-name>charEncode</param-name>
   <param-value>GB2312</param-value>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>CharsetEncodingFilter</filter-name>
  <url-pattern>*.jsp</url-pattern>
 </filter-mapping>
 <filter-mapping>
  <filter-name>CharsetEncodingFilter</filter-name>
  <url-pattern>*.do</url-pattern>
 </filter-mapping>

 

 

其配置的大致与servlet是一致的,这样的话,任何以.jsp、.do结尾的请求都会被fliter拦截到,从而用指定的编码设置字符集,这样就可以实现编码简洁了。

posted @ 2015-11-29 19:33  白色的回忆  阅读(744)  评论(0编辑  收藏  举报