Filter和Lisenter

375 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情

Filter

其实在Filter内存马时候已经了解过,是一种Servlet的规范,在到达Servlet前进行的一段过滤

Servlet

@WebServlet("/demo01.do")
public class Demo01Servlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo01 service.....");
        req.getRequestDispatcher("success.html").forward(req,resp);
    }
}

Filter

@WebFilter("/demo01.do")
public class Demo01Filter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
​
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("helloA");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("helloA2");
    }
    @Override
    public void destroy() {
    }
​
​
}

结果

根据图示在理解一下:

当访问/demo01.do时,首先会调用doFilter方法进行过滤,输出helloA,过滤后到达service()方法,之后通过过滤器放行,输出helloA2,再回显给客户端

filter中也可以使用通配符即:@WebFilter("*.do"),用这种方式来匹配以do结尾的请求

过滤链

分别定义三个:filter1、filter2、filter3,并在放行前后分别输出A1|A2、B1|B2、C1|C2,看一下调用后的结果:

结果

示意图

可以看到三个过滤器的执行过程,但这里引入了一个新问题:如何知道先执行那个过滤器?

  • 如果采取的是注解的方式:过滤器链的拦截顺序是按全类名的先后顺序排序的
  • 如果采取的是xml的方式:按照配置的先后顺序进行排序

Lisenter

顾名思义就是监听器,他能够监听一些事件从而来达到一些效果。在请求网站的时候, 程序先执行listener监听器的内容:Listener -> Filter -> Servlet

监听器列表

  • ServletContext,服务器启动和终止时触发

    • ServletContextListener:监听ServletContext对象的创建和销毁的过程
    • HttpSeesionListener:监听HttpSeesion对象的创建和销毁的过程
    • ServletRequestListener:监听ServletRequest对象的创建和销毁的过程
  • Session,有关Session操作时触发

    • ServletContextAttributeLisenter:监听ServletContext的保存作用域的改动(add、remove、replace)
    • HttpSessionAttributeListener:监听HttpSession的保存作用域的改动(add、remove、replace)
    • ServletRequestAttributeListener:监听ServletRequest的保存作用域的改动(add、remove、replace)
  • Request,访问服务时触发

    • HttpSessionBindingListener -监听某个对象在session域中的创建与移除
    • HttpSessionActivationListener -监听某个对象在session域中的序列化和反序列化