Filter过滤器
1. 什么是filter
filter本质上也是一个类,这个类需要实现java提供的filter规范,在方法中书写过滤的条件。filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行。
2. filter的执行流程
- 浏览器访问服务器资源
- 判断是否有过滤器与该资源相关联
- 过滤器1执行doFilter方法拦截请求
- 对浏览器请求服务器提交的信息进行过滤
- 过滤器1调用FilterChain放行,调用下一个过滤器
- 过滤器2执行doFilter方法拦截请求
- 对浏览器请求服务器提交的信息进行过滤,请求访问资源
- 资源发送响应给浏览器
- 过滤器2获取资源响应数据
- 过滤器1获取资源响应数据
- 将响应数据发送给浏览器
3. 多个filter的执行顺序
配置文件方式:如果多个filter对同一个资源进行了拦截,执行的顺序是配置文件的从上到下顺序。
注解方式:如果多个filter对同一个资源进行了拦截,执行的顺序是按照filter文件名的自然排序顺序执行。
4. filter的生命周期
从filter的出生到filter的死亡 有3个方法伴随:init() doFilter() destory()
- 当服务器启动的时候,过滤器就创建并初始化了,执行过滤器的init方法
- 每当一个请求的路径是满足过滤器的配置路径,那么就会执行一次过滤器的doFilter方法
- 当服务器停止的时候,销毁过滤器,执行过滤器的destory方法
5. filter的拦截方式
默认:filter只拦截浏览器过来的请求,不拦截服务器内部的请求。
如果想让filter拦截服务器内部的请求:
1:xml方式配置
在<filter-mapping>的标签中添加标签<dispatcher>FORWARD</dispatcher>
但是这种配置将filter默认的拦截方式给覆盖了,只会拦截服务器内部的请求,不会再拦截默认的浏览器请求了。
想让filter拦截服务器内部的请求又拦截浏览器过来的请求:
<filter-mapping>
<filter-name>MyFilter2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher> 配置拦截服务器内部请求
<dispatcher>REQUEST</dispatcher> 配置拦截浏览器的请求
</filter-mapping>
2:注解方式配置
@WebFilter(dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
该注解配置既会拦截浏览器过来的请求,又会拦截服务器内部的请求。
Listener监听器
1. 什么是listener
listener本质上是一个类,实现了java的listener规范,可以监听其它对象(域对象)的状态变化,比如 ServletContext,HttpSession,ServletRequest的创建和销毁等。可以在某些动作前后增加处理,实现监控。
2. listener的使用场景
1.系统启动时初始化信息
ServletContextListenner用来监听ServletContext对象的创建和销毁的。当项目启动的时候,servletContext对象被创建,会调用ServletContextListenner的contextInitialized方法。所以我们可以在此方法中初始化项目需要的信息。(框架的配置文件)
2.统计在线人数
我们知道,每当一个用户访问项目的时候,都会创建一个session会话。所以当前session会话被创建,当前在线用户+1,每当session会话被销毁,当前在线用户-1。HttpSessionListener可以用来监听session对象的创建和销毁 的。所以可以在HttpSessionListener中的监听session对象创建和销毁的方法中控制在线人数的加减。