---Filter(二)针对http请求的Filter

来源:互联网 发布:淘宝宝贝优化 编辑:程序博客网 时间:2024/05/16 06:15

在使用filter的时候,因为从接口Filter中的doFilter方法中的参数是ServletRequest和ServletResponsevoid doFilter(ServletRequest request, ServletResponse response, FilterChain chain),但是对于大多数时候都是针对http来用的,可以参照Generic的做法,设计一个抽象类,让其成为所有Filter的父类。

具体做法:

  1. 重载接口中的doFilter方法,将ServletRequest和ServletResponse改为为HttpServletRequest和HttpServletResponse。
  2. 在实现自Filter接口中的中将ServletRequest和ServletResponse强制转为HttpServletRequest和HttpServletResponse,并且调用对应的http的方法
  3. 添加一个FilterConfig属性,设置其getter方法,并且在init(FilterConifig filterConfig)中初始化当前的属性;
  4. 再重写一个空参的init()方法,并且在带参的init(FilterConifig filterConfig)中调用。当子类需要重写init方法的时候,重写空参的init方法即可。
    HttpFilter.java
package com.tuxianchao.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;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** *  * 利用Filter来过滤的时候大都是Http请求和Http响应,在doFilter方法中,参数类是ServletRequest和ServletResponse * ,使用的时候一般需要强制转换为HttpServletRequest和HttpServletResponse * 。针对这个问题,可以仿照GenericServlet 的做法,来定义一个HttpFilter,用作所有Filter的父类 *  *  *  */public abstract class HttpFilter implements Filter {    private FilterConfig filterConfig;    public FilterConfig getFilterConfig() {        return filterConfig;    }    public void destroy() {    }    public abstract void doFilter(HttpServletRequest request,            HttpServletResponse response, FilterChain chain)            throws IOException, ServletException;    /*     *      * 原生的Filter接口的实现方法doFilter中,     * 将ServletRequest和ServletResponse转为HttpServletRequest和     * HttpServletResponse,并且调用了重载的doFilter(HttpServletRequest request,     * HttpServletResponse response, FilterChain chain)方法     */    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        doFilter((HttpServletRequest) request, (HttpServletResponse) response,                chain);    }    public void init(FilterConfig filterConfig) throws ServletException {        this.filterConfig = filterConfig;        init();    }    /**     * 供子类继承的初始化方法.如果之类需要重写init方法,建议重写空参的init方法,直接覆盖带参的init方法如果不在子类中调用父类的     * init方法(super.init(config)),容易造成filterConfig未初始化,     */    protected void init() {        // TODO Auto-generated method stub    }}
0 0