zoukankan      html  css  js  c++  java
  • 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拦截到,从而用指定的编码设置字符集,这样就可以实现编码简洁了。

  • 相关阅读:
    克罗内克符号
    子进程和线程
    力扣:数学问题
    iconv装换文件编码格式
    mac 上iterm终端显示中文为乱码解决方案
    Android启动时间测试方法
    Centos4.3安装MySQL-python-1.2.3,出现error: command 'gcc' failed with exit status 1
    java mail发送邮件
    Java通过socket实现smtp协议发送邮件
    vim解决中文显示乱码问题
  • 原文地址:https://www.cnblogs.com/lizhenlin/p/5005243.html
Copyright © 2011-2022 走看看