Java Web 过滤器的典型应用

  在 Java Web 项目的开发中,过滤器的应用十分广泛,其中比较典型的应用就是字符编码过滤器。由于 Java 程序可以在多种平台下运行,其内部使用 Unicode 字符集来表示字符,所以处理中文数据会产生乱码情况,需要对其进行编码转换才可以正常显示。

  (1)创建字符编码过滤器类 CharacterEncodingFilter,此类实现了 Filter 接口,并对其3个方法进行了实现。代码如下:

/**
 * 这是一个字符编码的过滤器
 * @author ph
 */
public class CharacterEncodingFilter implements Filter {
    //字符编码初始化
    protected String encoding = null;
    //FilterConfig 对象
    protected FilterConfig filterConfig = null;
    //初始化方法
    public void init(FilterConfig filterconfig) throws ServletException {
        //对 filterConfig 赋值
        this.filterConfig = filterconfig;
        //对初始化参数赋值
        this.encoding = filterconfig.getInitParameter("encoding");
    }
    //过滤器处理方法
    public void doFilter(ServletRequest servletrequest,
            ServletResponse servletresponse, FilterChain filterchain)
            throws IOException, ServletException {
        //判断字符编码是否有效
        if(encoding != null) {
            //设置 request 字符编码
            servletrequest.setCharacterEncoding(encoding);
            //设置 response 字符编码
            servletresponse.setContentType("text/html;charset=" + encoding);
        }
        //传递给下一个过过滤器
        filterchain.doFilter(servletrequest, servletresponse);
    }
    //销毁方法
    public void destroy() {
        //释放资源
        this.encoding = null;
        this.filterConfig = null;
    }
}

  CharacterEncodingFilter 类的 init() 方法用于读取过滤器的初始化参数,这个参数(encoding)为此例中所用到的字符编码;在 doFilter() 方法中,分别将 request 对象及 response 对象中的编码格式设置为读取到的编码格式;最后在destroy() 方法中将其属性设置为 null,将被 Java 垃圾回收器回收。

  (2)在 web.xml 文件中,对过滤器进行配置。代码如下:

    <!-- 声明字符编码过滤器 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.ph.util.CharacterEncodingFilter</filter-class>
        <!-- 设置初始化 -->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <!-- 映射字符编码过滤器 -->
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!-- 与所有请求进行关联 -->
        <url-pattern>/*</url-pattern>
        <!-- dispatcher用于指定过滤器对应的请求方式  -->
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

  附上 dispatcher 的可选值及说明

dispatcher 的可选值及说明
可选值 说明
REQUEST 当客户端直接请求时,通过过滤器进行处理
INCLUDE 当客户端通过 RequestDispatcher 对象的 include() 方法请求时,通过过滤器处理
FORWARD 当客户端通过 RequestDispatcher 对象的 forward() 方法请求时,通过过滤器进行处理
ERROR 当声明式异常产生时,通过过滤器进行处理

  (3)通过请求对过滤器进行验证,使用表单向 Servlet 发送中文信息进行测试,其中表单信息放置在 index.jsp 页面中。代码如下:

  <p>请输入您的姓名:<input type="text" name="name"/></p>
  <input type="submit" value="提交"/>

  这一请求由 Servlet 对象 MyServlet 类进行处理,此类使用 doPost() 方法接收表单请求,并将表单中的 name 属性输出到页面中。代码如下:

    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        //获取表单参数
        String name = req.getParameter("name");
        if(name!=null && !name.isEmpty()) {
            out.print("您好 " + name);
            out.print(",<br/>欢迎来到我的主页。");
        } else {
            out.print("请输入您的中文名字!");
        }
        out.print("<br/><a href='index.jsp'>返回</a>");
        out.flush();
        out.close();
    }

  实例运行结果:

1、输入前  输入前

2、过滤后效果过滤

3、未过滤效果未过滤

原文地址:https://www.cnblogs.com/tinypeng/p/3404448.html