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.记录访问次数
120

被折叠的 条评论
为什么被折叠?



