Filter&Listener
# Filter:过滤器
# 1. 概念
- 生活中的过滤器:净水器、空气净化器、土匪……
- Web 中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
- 过滤器的作用:一般用于完成通用的操作,如:登录验证、统一编码处理、敏感字符过滤等。
# 2. 快速入门
# 步骤:
- 定义一个类,实现接口
Filter - 复写方法
- 配置拦截路径
- 使用
web.xml - 或使用注解
- 使用
# 示例代码:
@WebFilter("/*") // 访问所有资源之前,都会执行该过滤器
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("filterDemo1被执行了....");
// 放行
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
# 3. 过滤器细节
# web.xml 配置
<filter>
<filter-name>demo1</filter-name>
<filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
\<url-pattern\>/*\</url-pattern\>
</filter-mapping>
# 执行流程:
- 执行过滤器
- 执行放行后的资源
- 回来执行放行后下方的过滤器代码
# 生命周期方法:
- init():服务器启动后执行一次
- doFilter():每次请求都会执行
- destroy():服务器正常关闭时执行一次
# 拦截路径配置说明:
- /index.jsp:拦截具体资源
- /user/*:拦截某个目录下所有资源
- *.jsp:拦截所有 .jsp 资源
- /*:拦截所有资源
# 拦截方式 dispatcherTypes(注解配置)
- REQUEST:默认,浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
# web.xml 配置拦截方式
<dispatcher>FORWARD</dispatcher>
# 多个过滤器执行顺序(过滤器链):
执行顺序:
- 过滤器1
- 过滤器2
- 资源执行
- 返回过滤器2
- 返回过滤器1
先后顺序:
- 注解:按类名字符串字典序排序
- web.xml:谁定义在上面,谁先执行
# 4. 案例
# 案例1:登录验证
访问资源前,判断是否登录:
- 登录了 → 放行
- 未登录 → 跳转到登录页面,提示:您尚未登录,请先登录
# 案例2:敏感词汇过滤
- 对输入数据做敏感词过滤
- 敏感词来自《敏感词汇.txt》
- 替换为 ***
# 分析:
- 对 request 对象增强,拦截参数获取方法
# 涉及设计模式:
# 装饰模式 / 代理模式
代理模式概念:
- 真实对象:被代理的对象
- 代理对象:增强后的对象
实现方式:
- 静态代理:代码中写代理类
- 动态代理:运行时生成代理类
# 动态代理步骤:
- 代理类和真实类实现同一接口
- 使用 Proxy.newProxyInstance() 创建代理对象
- 使用代理对象调用方法
- 在方法中增强逻辑
增强方式:
- 增强参数
- 增强返回值
- 增强方法体逻辑
# Listener:监听器
# 概念
Web 三大组件之一
基于 事件监听机制
- 事件:一件事
- 事件源:事件发生的位置
- 监听器:对事件作出响应的对象
- 注册监听:事件 + 源 + 监听器绑定,当事件源上事件发生时触发监听器代码
# ServletContextListener
监听 ServletContext 对象的 创建与销毁
# 方法:
void contextInitialized(ServletContextEvent sce) // 创建后执行
void contextDestroyed(ServletContextEvent sce) // 销毁前执行
# 开发步骤:
- 定义一个类,实现 ServletContextListener 接口
- 复写两个方法
- 配置监听器
# 方法1:web.xml 配置
<listener>
<listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
</listener>
- 可结合 <context-param> 指定初始化参数
# 方法2:注解方式
@WebListener
public class MyListener implements ServletContextListener {
...
}
上次更新: 2025/07/23, 01:37:33