过滤监听器
# 过滤器 filter
过滤器是对web资源进行拦截,做⼀些处理后再交给下⼀个过滤器或servlet处理,通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理
# 应用步骤
添加
servlet
jar依赖包创建对象类 应用
javax.servlet.Filter接口
,并重写里面所有方法配置 url 的访问入口,有两种方式
web.xml
/@WebFilter
web.xml
文件配置<filter> <filter-name>过滤器映射名</filter-name> <filter-class>类路径</filter-class> </filter> <filter-mapping> <filter-name>过滤器映射名</filter-name> <url-pattern>请求url</url-pattern> </filter-mapping>
@WebFilter
注解配置@WebFiler("...") public class MyFilter implements Filter {...}
自定义过滤 约束 配置
回调servlet/转接过滤器 ,在
doFileter()
添加以下代码filterChain.doFilter(Request , Response);
# 过滤器注解说明
@WebFilter
注解配置
属性 | 值 [默认值] | 说明 |
---|---|---|
description | String [""] | 描述 |
displayName | String [""] | 显示名称 |
initParams | WebInitParam[] [{}] | 初始化参数 |
filterName | String [""] | 过滤器名称 |
value | String[] [{}] | 过滤地址url |
urlPatterns | String[] [{}] | 网址模式 |
dispatcherTypes | DispatcherType[] [REQUEST] | 拦截形式 |
asyncSupported | Boolean [false] | 异步支持 |
拦截形式 | 说明 |
---|---|
FORWARD | 转发访问资源 |
INCLUDE | 包含访问资源 |
REQUEST | 请求资源 |
ASYNC | 异步访问资源 |
ERROR | 错误跳转资源 |
# 过滤器执行过程
- 客户端发出Web请求,如果 过滤器与此地址匹配,则会优先进入过滤器
- 请求会进入到 doFilter()方法,进行代码逻辑处理
- 调用 chain.doFilter()方法 放行请求,否则会拦截请求
- 请求通过后,响应回来依旧需要经过 过滤器
注意:
- 过滤器执行是同步的,因此 chain.doFilter()方法 之前是 请求处理的范围 ,则之后为 响应处理的范围
- 如果过滤器有多个,会依次执行所有匹配url的过滤器才能获取Web资源
# 过滤器声明周期
init()
: 在服务器启动后,会创建 Filter对象 ,然后 调用 init()方法 ,只会执行一次doFilter()
: 每次请求地址匹配都会拦截请求destroy()
: 在服务器关闭后,Filter对象被销毁 ,然后执行 destroy()方法 (前提需要在正常关闭情况下
注意: init() / destroy() 方法 一般用于 初次加载/释放资源 的情况
# 应用场景
- 防止用户未登陆访问资源
- 设置统一编码类型
- 加密、解密
- 过滤非法文字
- 下载资源的限制
- ...
# SpringBoot应用
大致过程
- 引入 sprintg-start-web 依赖应用
- 创建自定义类 继承
Filter
并实现所有方法 - 注册加载过滤器
SpringBoot架构注册过滤器方式
采用
@WebFilter
注解@Configuration public class FilterConfig { @Bean @WebFilter(filterName = "myFilter", urlPatterns = "/*") public MyFilter myFilterBean() { return new MyFilter(); } }
采用
FilterRegistrationBean
类 注册Bean@Configuration public class FilterConfig { @Bean public FilterRegistrationBean<MyFilter> myFilterBean() { FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new MyFilter()); registration.addUrlPatterns("/*"); return registration; } }
# 监听器 Listener
监听器是监听某个域对象的的状态变化的组件
事件源对象: request
、 session
、servletContext
监听状态: 创建、变化、销毁
**配置监听: ** 绑定与事件源的监听
**监听响应: ** 监听状态发生变化进行响应
监听器类型
接口 | ServletContext | HttpSession | ServletRequest |
---|---|---|---|
监听对象 创建/销毁 | ServletContextListener | HttpSessionListener | ServlerRequestListener |
监听对象属性变化 | ServletContextAttributeListener | HttpSessionAttributeListener | ServletRequestAttributeListener |
对象周期和用意
ServletContext 服务器启动 -> 服务器关闭
初始化对象、初始化数据(配置加载等信息)
Session
request.getSession
创建 -> 服务器关闭、超时销毁、手动销毁数据存取重要信息、网站记录数器 等。。。
Request 请求开始 -> 请求结束
信息交互的存取
应用步骤
添加
servlet
jar依赖包创建对象类 应用 监听的接口 并重写事件处理的方法
配置
web.xml
文件/添加注释@WebListener
(以下配置用于监听器使用)<listener> <listener-class>类路径</listener-class> </listener>