Web服务端技术:过滤器与监听器

1 过滤器

 重复代码的适用场景:

        编码的设置:注册用户/添加/修改图书信息的场景:

                从表单提交数据到Servlet ---> 在Servlet中设置编码 ---> 处理参数和结果

        项目中对某一类资源的访问进行限定,用户身份鉴定: 需要登录认证才可进行资源访问

        要解决这样的问题,可以把所有重复代码进行抽取封装,之后在用到的地方来进行调用,这就是过滤器的作用。

        Filter用于修改request、response对象

2.1 什么是过滤器

        Filter被称为过滤器,Filter基本功能就是对Servlet容器调用Servlet的过程进行拦截,它位于客户端和处理程序之间,能够对请求和响应进行检查和修改

过滤器与Servlet的区别

        Servlet:面向功能,对单一请求进行处理,

        而过滤器:面向资源,对某一类资源的请求进行统一处理。

过滤器的应用场景

1.字符编码过滤

        在用户请求被Servlet处理前设置Request的字符编码以解决乱码问题

2.统一缓存控制

        对某一类资源如图片文件夹、css文件夹下的资源请求在Response响应头上添加缓存有效期设置,对经常变化的页面如首页、新闻在Response响应头上添加不缓存设置。

3.用户登陆与权限控制

        用户请求到达资源前判断用户是否登录(session),是否对资源有权限,如果没有则将请求重定向到登录或出错页

4.资源保护

        当用户请求资源(mp3、图片等)前,通过判断请求参数信息,如session、referer等,决定是否允许用户下载,从而达到防盗的功能。

Filter相关API

        Filter中包含了3个接口,分别是Filter接口、FilterConfig接口和FilterChain接口

public interface Filter{
default void init(FilterConfig filterConfig) throws ServletException{
}

void doFilter(servletRequest var1,ServletResponse var2,FilterChain var3)
default void destory(){}
}
 1.FilterConfig接口

        用于封装Filter的配置信息,在Filter初始化时,服务器将FilterConfig对象作为参数传递给Filter对象的初始化方法

2.FilterChain接口

        FilterChain接口的doFilter()方法用于调用过滤器链中的下一个过滤器,如果这个过滤器是链上的最后一个过滤器,则将请求提交给处理程序或将响应发给客户端。

Filter生命周期

        Filter的生命周期指的是一个Filter对象从创建到执行再到销毁的过程。

        Filter接口中的三个方法就是管理Filter对象生命周期的方法。

        Filter的生命周期可分为创建、执行、销毁三个阶段。

1.创建

        Web服务器启动的时候会创建Filter实例对象,并调用init()方法完成对象的初始化。需要注意的是,在一次完整的请求当中,Filter对象只会创建一次,init()方法也只会执行一次

2.执行

        当客户端请求目标资源时服务器会筛选出符合映射条件的Filter,并按照类名的先后顺序依次执行doFilter() 方法。 例如MyFilter01优先MyFilter02执行。在一次完整的请求当中,doFilter()方法可以执行多次。

3.销毁

        服务器关闭时,Web服务器调用destroy()方法销毁Filter对象。

实现第一个Filter

        1. 定义一个类,实现Filter接口

        2. 重写接口规范方法

        3. 配置过滤资源

               (1) web.xml配置方式

                (2) 注解配置:在创建的Filter上使用@WebFilter注解进行配置

                        在使用注解方式配置Filter中,没有参数来表明Filter的过滤顺序,Web服务器在加载时会按照Filter的文件名也就是它们的类名的顺序进行加载,所以可以通过Filter的文件名的字母控制过滤顺序,例如:Filter0_UserLogin.java、Filter1_ApiLog.java,这样就能先执行“用户登录检查过滤器”再执行“接口日志过滤器

@webFilter(filterName = "advancFilter",urlPatterns = "/advanceServlet")
public class AdvanceFilter implements Filter{
    @Override
    public void init(FilterConfig filterconfig) throws ServletException{
        /// 过滤器对象在初始化时调用,可以配置一些初始化参数
    }

    @Override
    public void doFilter(ServletRequest servletRequest,ServletResponse                 servletResponse,FilterChain filterChain){
        /// 用于拦截用户的请求,如果和当前过滤器拦截路径匹配,方法被调用

    }

    @Override
    public void destory(){}

}

过滤器链

        一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。 根据注册方式不同,Filter链的执行顺序也不同。

2 监听器

2.1 Listener概述

        在Web程序开发中,经常需要对某些事件进行监听,以便及时作出处理,如监听鼠标单击事件、监听键盘按下事件等。 为此,Servlet提供了监听器(Listener),专门用于监听Servlet事件。

        用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

2.2 监听器的主要组成部分

        (1)事件:用户的一个操作,如单击一个按钮、调用一个方法、创建一个对象等。

        (2)事件源:产生事件的对象

        (3)事件监听器:负责监听发生在事件源上的事件。

        (4)事件处理器:监听器的成员方法,当事件发生的时候会触发对应的处理器(成员方法)。

注意:当用户执行一个操作触发事件源上的事件时,该事件会被事件监听器监听到,当监听器监听到事件发生时,相应的事件处理器就会对发生的事件进行处理。

2.3 监听器的工作过程

(1)将监听器绑定到事件源,也就是注册监听器。

(2)监听器监听到事件发生时,会调用监听器的成员方法,将事件对象传递给事件处理器,即触发事件处理器。

(3)事件处理器通过事件对象获得事件源,并对事件源进行处理。

2.4 Listener 分类

        在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象

        Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:

        监听域对象自身的创建和销毁的事件监听器。

        监听域对象中的属性的增加和删除的事件监听器。

        监听绑定到HttpSession域中的某个对象的状态的事件监听器

2.5 监听器常见的应用场景

1.在线用户数统计

2.系统启动时间

3.记录访问次数

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值