Filter&Listener【web服务器三大组件之过滤器&监听器】

Filter【过滤器】

1.Filter简介

1.1Filter是web【三大】组件之一【Servlet&Listener】

  • web组件共性
    – 都需要实现某个接口
    –都需要在web.xml中注册

1.2Filter作用

  • Servlet作用:【处理】浏览器(客户端)与服务器之间的请求&响应
  • Filter作用:【过滤】浏览器(客户端)与服务器之间的请求&响应

1.3Filter中常用的API

  • FIlter接口:
    – init():用于Filter初始化
    –doFilter():作用与service()方法作用类似。是过滤请求和响应的。
    –destory():用于Filter对象销毁。
  • FilterChain接口:
    –doFilter()方法,用于调用Filter链上的下一个构造器,如果当前过滤器是最后一个过滤器时,则将请求发送到目标资源。
  • FilterConfig接口:
    –getFilterName():获取FIlter名称
    –getServletContext():获取ServletContext对象
    – getInitParameter():获取Filter的初始化参数
    –getInitParameterNames():获取Filter初始化参数的名称

2.Filter的工作原理

  • 2.1浏览器发送请求【/UserServlet】,触发过滤器。
  • 2.2执行过滤器中的相应方法【doFilter()】,放行此代码,过滤请求。
  • 2.3放行请求:【chain.doFilter(request,response);】
  • 2.4执行目标资源【Servlet】,处理请求,做出响应
  • 2.5执行过滤器中的相应方法【doFilter()】,放行后代码,过滤相应
  • 2.6响应

3.Filter声明周期

3.1Servlet

  • 构造器
    –执行时机:在第一次接收请求时,执行
    –执行次数:在整个声明周期中,只执行一次
  • init()
    –执行时机:在第一次接收请求时,构造器执行之后,执行
    –执行次数:在整个声明周期中,只执行一次
  • service()
    –执行时机:在每次接收请求时,执行
    –执行次数:在整个生命周期中,执行n次。【n>=1】
  • destroy()
    –执行时机:在关闭或重启服务器时,执行
    –执行次数:在整个声明周期中,执行一次。

3.2+Filter

  • 构造器
    –执行时机:在启动服务时,执行
    –执行次数:在整个生命周期中,只执行一次
  • init()
    –执行时机:在启动服务时,构造器执行之后,执行
    –执行次数:在整个生命周期中,只执行一次
  • doFilter()
    –执行时机:每次请求触发Filter时【请求Filter-Url】,执行
    –执行次数:在整个生命周期中,执行n次。【n>=1】
  • destroy()
    –执行时机:在关闭或重启服务器时,执行
    –执行次数:在整个声明周期中,执行一次。

4.多个Filter工作原理【重点】

  • 4.1浏览器发送请求,【/UserServlet】,触发过滤器
  • 4.2执行【过滤器1】中的相应方法【doFilter()】,放行前代码,过滤请求
  • 4.2执行【过滤器1】中的相应方法【doFilter()】,放行前代码,过滤请求
  • 4.3放行请求【chain.doFilter(request,response);】
  • 4.4执行目标资源【Servlet】,处理请求,做出响应
  • 4.5执行【过滤器2】中相应方法【doFilter()】,放行后代码,过滤响应
  • 4.5执行【过滤器1】中相应方法【doFilter()】,放行后代码,过滤响应
  • 4.6响应
    注意:Filter的执行顺序由Filter的加载顺序决定,Filter的加载顺序由web.xml中【】的配置顺序决定。
    多个Filter执行顺序

5.Filter中URL的配置规则【重点】

5.1精确匹配

  • /路径1/路径2/…/资源路径,如:
<filter-mapping>
        <filter-name>MySedFilter</filter-name>
        <url-pattern>/UserServlet</url-pattern>
    </filter-mapping>
  • 通过名称匹配,如:
<filter-mapping>
    <filter-name>MySedFilter</filter-name>
    <servlet-name>UserServlet</servlet-name>
</filter-mapping>

5.2模糊匹配【路径带*的匹配】

  • 目录匹配:/路径/…/*,匹配【当前路径下】的所有资源
<filter-mapping>
    <filter-name>UrlTestFilter</filter-name>
    <url-pattern>/pages/*</url-pattern>
</filter-mapping>
  • 后缀匹配:*.后缀名,匹配【任意路径下的指定后缀名】资源。
<filter-mapping>
    <filter-name>UrlTestFilter</filter-name>
    <url-pattern>*.html</url-pattern>
</filter-mapping>

注意:后缀匹配的“”,只能书写在首位【最前面】,不能在“”前面添加任何内容。“*”可以书写在url的最前面,或书写在url的最后面,不能书写在中间位置。

代表当前项目下的所有资源
<url-pattern>/*</url-pattern>

6.HttpFilter

6.1为什么谈HttpFilter?

因为在学习Servlet中,我们发现,最终创建Servlet的方式【继承HttpServlet】。所以,Fiter的最终实现,最好也存在HttpFilter。但在Tomcat底层源码中,并未提供HttpFilter()

6.2手动搭建HttpFiter

  • 提供一系列获取常用对象的方法,便于子类中的直接使用
  • 将doFilter()方法抽象化,在子类中重写doFilter方法。
  • 将doFilter()方法重载,类型转换入。【ServletRequest->HttpServletRequest】
  • 示例代码
  private FilterConfig filterConfig;

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//        chain.doFilter(req, resp);
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;

        doFilter(request,response,chain);
    }

    /**
     *
     * @param req
     * @param resp
     * @param chain
     * @throws ServletException
     * @throws IOException
     */
    public abstract void doFilter(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws ServletException, IOException ;

    public void init(FilterConfig config) throws ServletException {
        filterConfig = config;
    }

    /**
     * 获取FilterConfig对象
     * @return
     */
    public FilterConfig getFilterConfig() {
        return filterConfig;
    }

    /**
     * 获取ServletContext对象
     * @return
     */
    public ServletContext getServletContext(){
        return filterConfig.getServletContext();
    }

Listener监听器

1.Listener简介

  • Listener是服务器三大组件之一【Servlet&Filter】
  • Listener主要用于【监听】web应用中对象及对象中的属性变化【创建、修改及销毁】等情况。

2.Listener作用

2.1生活中的监听器-狗仔

  • 监听者:狗仔
  • 监听对象:明星
  • 监听事件:绯闻等各种瓜
  • 监听结果:拿钱or头条热搜见

2.2 程序中的监听器

  • 监听者:程序员创建
  • 监听对象:ServletContext、HTTPSession、HTTPSessionRequest等
  • 监听事件:对象的创建、销毁、属性变化等
  • 监听结果:项目需求

3.Listener基本使用

  • 3.1实现某个接口
  • 3.2在web.xml中注册
<listener>
    <listener-class>com.atguigu.listener.ApplicationTestListener</listener-class>
</listener>

总结Web三大组件

  • web三大组件的加载顺序:Listener > Filter > Servlet
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值