day13_Filter_Listener

Filter

1. Filter简介

  • Filter【过滤器】:是web三大组件之一【Servlet&Listener】

    • web组件共性

      1. 都需要实现某个接口
      2. 都需要注册【web.xml或注解】
  • Filter主要用于过滤请求和响应
  • Filter常用API

    • Filter接口:编写Filter需要实现Filter接口,我们来看一下Filter接口的主要方法:

      • init()方法用于初始化Filter
      • doFilter()作用和service()方法类似,是过滤请求和响应的主要方法。
      • destroy()用于在Filter对象被销毁前做一些收尾工作。如:释放资源等。
    • FilterConfig对象在服务器调用init()方法时传递进来。

      • getFilterName() 获取Filter的名字
      • getServletContext() 获取ServletContext对象(即application)
      • getInitParameter() 获取Filter的初始化参数
      • getInitParameterNames() 获取所有初始化参数的名字
    • FilterChain对象是在doFilter()方法被调用时作为参数传递进来的。

      • doFilter()方法用于调用Filter链上的下一个过滤器,如果当前过滤器为最后一个过滤器则将请求发送到目标资源。

2. Filter生命周期

  • 构造器

    • 执行时机:启动服务器时,执行。
    • 执行次数:在整个生命周期中,只执行一次。
  • init()

    • 执行时机:启动服务器时,执行构造器后,执行。
    • 执行次数:在整个生命周期中,只执行一次。
  • doFilter()

    • 执行时机:每次接收【过滤URL】时,执行。
    • 执行次数:在整个生命周期中,只执行n次。【n>=1】
  • destroy()

    • 执行时机:关闭服务器时,执行。
    • 执行次数:在整个生命周期中,只执行一次。

3. Filter工作原理

3.1 单个Filter工作原理

  • 浏览器向服务器发送请求【过滤器URL】
  • 执行过滤器【放行请求之前】代码,过滤请求
  • 放行请求:chain.doFilter(request,response);
  • 执行目标资源:Servlet,处理请求,做出响应
  • 执行过滤器【放行请求之后】代码,过滤响应
  • 执行响应

3.2 多个Filter工作原理

  • 浏览器向服务器发送请求【过滤器URL】
  • 执行过滤器1【放行请求之前】代码,过滤请求
  • 放行请求:chain.doFilter(request,response);
  • 执行过滤器2【放行请求之前】代码,过滤请求
  • 放行请求:chain.doFilter(request,response);
  • 执行目标资源:Servlet,处理请求,做出响应
  • 执行过滤器2【放行请求之后】代码,过滤响应
  • 执行过滤器1【放行请求之后】代码,过滤响应
  • 执行响应

过滤器顺序由【】先后顺序决定

4. URL配置规则

  • 精确匹配

      1. <filter-mapping>
      2. <filter-name>Filter2</filter-name>
      3. <url-pattern>/MyFirstServlet</url-pattern>
      4. </filter-mapping>
    1. <filter-mapping>
    2. <filter-name>Filter2</filter-name>
    3. <servlet-name>MyFirstServlet</servlet-name>
    4. </filter-mapping>
  • 模糊匹配:URL中包含【*】的匹配

    • 前置模糊【后缀名匹配】:将【*】书写在URL的最前面

      • *.jsp
    • 后置模糊【目录匹配】:将【*】书写在URL的最后面

      • /dir/dir2/*
  • 常用的URL配置

      1. <!-- 通用于Servlet&Filter当前项目下的所有路径 -->
      2. <url-pattern>/*</url-pattern>
      3. <!-- 在Servlet中配置URL 当前项目下的所有路径 [排除所有jsp]-->
      4. <url-pattern>/</url-pattern>

5. HttpFilter

javax.servlet.Servlet -> javax.servlet.http.HttpServlet

EndServlet : HttpServlet : GenericServlet : Servlet

  • 手动搭建底层HttpFilter

    • 提供获取FilterConfig和ServletContext对象方法
    • 抽象化doFilter()方法
    • 强制类型转换,如:ServletRequest->HttpServletRequest
  • 代码

    1. public abstract class HttpFilter implements Filter {
    2. //1.提供获取FilterConfig和ServletContext对象方法
    3. private FilterConfig filterConfig;
    4. /**
    5. * 获取FilterConfig对象
    6. * @return
    7. */
    8. public FilterConfig getFilterConfig(){
    9. return filterConfig;
    10. }
    11. /**
    12. * 获取ServletContext对象
    13. * @throws ServletException
    14. */
    15. public ServletContext getServletContext(){
    16. return filterConfig.getServletContext();
    17. }
    18. @Override
    19. public void init(FilterConfig filterConfig) throws ServletException {
    20. this.filterConfig = filterConfig;
    21. }
    22. @Override
    23. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    24. HttpServletRequest req = (HttpServletRequest)request;
    25. HttpServletResponse res = (HttpServletResponse)response;
    26. doFilter(req,res,chain);
    27. }
    28. public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException;
    29. @Override
    30. public void destroy() {
    31. }
    32. }

Listener

1. Listener简介

  • 生活中的监听器【工种-狗仔队】

    • 监听对象:狗仔队
    • 监听目标:明星
    • 监听事件:绯闻、花边新闻、…
    • 监听结果:头条见
  • 程序中的监听器

    • 监听对象:创建
    • 监听目标:application、session、request
    • 监听事件:对象创建、修改、销毁、对象中属性变化等
    • 监听结果:程序需求

2. 使用Listener

  • 实现某个接口
    1. public class TestApplicationListener implements ServletContextListener {
    2. /**
    3. * application被创建啦
    4. * @param sce
    5. */
    6. @Override
    7. public void contextInitialized(ServletContextEvent sce) {
    8. System.out.println("servletContext对象被创建啦!");
    9. }
    10. /**
    11. * application被销毁啦
    12. * @param sce
    13. */
    14. @Override
    15. public void contextDestroyed(ServletContextEvent sce) {
    16. System.out.println("servletContext对象被销毁啦!");
    17. }
    18. }
  • 注册
    1. <!-- web.xml -->
    2. <listener>
    3. <listener-class>com.atguigu.listener.TestApplicationListener</listener-class>
    4. </listener>
    5. <!--注解:@WebListener -->
  • 总结:Web组件加载顺序: Listener > Filter > Servlet