监听器与过滤器(Listener & Filter)详解
Listener
监听器
- 能做什么事?
监听某一个事件的发生。 状态的改变。
- 监听器的内部机制
其实就是接口回调.
接口回调
- 需求:
A在执行循环,当循环到5的时候, 通知B。
事先先把一个对象传递给 A , 当A 执行到5的时候,通过这个对象,来调用B中的方法。 但是注意,不是直接传递B的实例,而是传递一个接口的实例过去。
Web监听器
总共有8个 划分成三种类型
- 定义一个类,实现接口
- 注册 | 配置监听器
监听三个作用域创建和销毁
request —httpServletRequest
session —httpSession
aapplication — ServletContext
1 | 1. ServletContextListener |
1 | 2. ServletRequestListener |
1 | request销毁: |
1 | public class MyRequestListener implements ServletRequestListener { |
1 | <listener> |
1 | 3. HttpSessionListener |
作用:
1 | ServletContextListener |
监听三个作用域属性状态变更
可以监听在作用域中值 添加 | 替换 | 移除的动作。
- servletContext — ServletContextAttributeListener
- request — ServletRequestAttributeListener
- session — HttpSessionAttributeListener
监听httpSession里面存值的状态变更
这一类监听器不用注册。
- HttpSessionBindingListener
监听对象与session 绑定和解除绑定 的动作
1 | 1. 让javaBean 实现该接口即可 |
- HttpSessionActivationListener
用于监听现在session的值 是 钝化 (序列化)还是活化 (反序列化)的动作
- 钝化 (序列化)
把内存中的数据 存储到硬盘上
- 活化 (反序列化)
把硬盘中的数据读取到内存中。
- session的钝化活化的用意何在
session中的值可能会很多, 并且我们有很长一段时间不使用这个内存中的值, 那么可以考虑把session的值可以存储到硬盘上【钝化】,等下一次在使用的时候,在从硬盘上提取出来。 【活化】
- 如何让session的在一定时间内钝化.
做配置即可
1 | 1. 在tomcat里面 conf/context.xml 里面配置 |
Filter
过滤器 , 其实就是对客户端发出来的请求进行过滤。 浏览器发出, 然后服务器派servlet处理。 在中间就可以过滤, 其实过滤器起到的是拦截的作用。
作用
- 对一些敏感词汇进行过滤
- 统一设置编码
- 自动登录
…
如何使用Filter
定义一个类, 实现Filter
public class FilterDemo implements Filter {
1
2
3
4
5
6
7
8
9
10
11
12public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("来到过虑器了。。。");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}注册过滤器
在web.xml里面注册,注册的手法与servlet基本一样。
1 | <filter> |
Filter的生命周期
- 创建
在服务器启动的时候就创建。
- 销毁
服务器停止的时候。
Filter执行顺序
- 客户端发出请求,先经过过滤器, 如果过滤器放行,那么才能到servlet
- 如果有多个过滤器, 那么他们会按照注册的映射顺序 来 排队。 只要有一个过滤器, 不放行,那么后面排队的过滤器以及咱们的servlet都不会收到请求。
Filter细节:
- init方法的参数 FilterConfig , 可以用于获取filter在注册的名字 以及初始化参数。 其实这里的设计的初衷与ServletConfig是一样的。
- 如果想放行,那么在doFilter 方法里面操作,使用参数 chain
1 | chain.doFilter(request, response); 放行, 让请求到达下一个目标。 |
<url-pattern>/*</url-pattern>
写法格式与servlet一样。全路径匹配 以 / 开始
/LoginServlet
以目录匹配 以 / 开始 以 * 结束
/demo01/*
以后缀名匹配 以 * 开始 以后缀名结束
*.jsp *.html *.do
针对 dispatcher 设置
REQUEST : 只要是请求过来,都拦截,默认就是REQUEST
FORWARD : 只要是转发都拦截。 ERROR : 页面出错发生跳转 INCLUDE : 包含页面的时候就拦截。