Filter & Listener
Filter过滤器:
-
概念:
- 当访问服务器资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
- 登陆验证、统一编码处理、敏感字符过滤~~
-
快速入门:
- 定义类,实现接口
Filter
- 复写方法
- 配置拦截路径
@WebFilter("/*") public class CharSetFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { //放行请求 chain.doFilter(req, resp); } @Override public void init(FilterConfig config) throws ServletException { } }
- 定义类,实现接口
-
过滤器执行流程
- 执行过滤器
- 执行放行后的资源
- 回来执行过滤器放行代码下面的代码
-
过滤器生命周期方法
- init:在服务器启动后,会创建Filter对象,调用init方法,只执行一次,用于加载资源
- doFilter:每一次请求被拦截资源时,会执行,执行多次
- destory:在服务器关闭后,Filter对象被销毁,如果服务器正常关闭,会执行destory方法,只执行一次用于释放资源
-
过滤器配置详解
-
拦截路径配置:
- 具体的资源路径:
/index.jsp
,只有访问index.jsp
时过滤器才会被执行 - 拦截目录:
/user/*
访问/user
下所有资源时,过滤器都会被执行 - 后缀名拦截:
*.jsp
访问后缀名为jsp的资源时,过滤器就会被执行 - 拦截所有:
/*
拦截所有资源
- 具体的资源路径:
-
拦截方式配置:资源被访问的方式
-
注解配置:
-
设置
dispatcherTypes
属性:可以设置多个REQUEST
:默认值。浏览器直接请求资源FORWORD
:转发访问资源INCLUDE
:包含访问资源ERROR
:错误跳转资源ASYNC
:异步访问资源
@WebFilter(value = "/*",dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.INCLUDE})
-
-
web.xml
配置:- 设置
<dispatcherType></dispatcherType>
标签
- 设置
-
-
-
过滤器链(配置多个过滤器)
- 执行顺序:如果有两个过滤器:过滤器1和过滤器2
- 过滤器1
- 过滤器2
- 资源执行
- 过滤器2
- 过滤器1
- 过滤器先后顺序问题:
- 注解配置:按照类名字符串比较规则比较,值小的先执行
- 如:
AFilter
和BFilter
一起,AFilter
先执行
- 如:
web.xml
配置:谁定义在上面谁先执行
- 注解配置:按照类名字符串比较规则比较,值小的先执行
- 执行顺序:如果有两个过滤器:过滤器1和过滤器2
-
增强对象的功能:
- 设计模式:一些通用的解决固定问题的方式
- 装饰模式
- 代理模式
- 概念
- 真实对象:被代理的对象
- 代理对象:
- 代理模式:代理对象去代理真实对象,达到增强真实对象的目的
- 实现方式:
- 静态代理:有一个类文件来描述代理模式
- 动态代理:在内存中形成代理类
- 实现步骤:
- 代理对象和真实对象实现相同的接口
- 代理对象 = Proxy.newProxyInstance();
- 使用代理对象调用方法
- 增强方法
- 增强方式:
- 增强参数列表:获取
args[0]
,进行处理 - 增强返回值类型:重新写一个return语句
- 增强方法体执行逻辑:在方法里添加新的逻辑执行语句
- 增强参数列表:获取
- 实现步骤:
- 概念
- 设计模式:一些通用的解决固定问题的方式
Listener监听器:
1. 概念:web三大组件之一
* 事件监听机制:
* 事件:一件事件
* 事件源:事件发生的地方
* 监听器:一个对象
* 注册监听:将事件源、事件、监听器绑定到一起,当事件源发生某个事件后,执行监听器代码
* `ServletContextListener`:监听ServletContext对象的创建和销毁
* `void contextDestroyed(ServletContextEvent sce)`:ServletContext对象被销毁之前会调用该方法
* `void contextInitialized(ServletContextEvent sce)`:ServletContext对象创建后调用该方法
* 使用
* 实现ServletContextListener接口
* 重写方法
* 编写web.xml