Filter:过滤器
1. 概念
- 生活中的过滤器:净水器,空气净水器,土匪。
- Web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,来完成一些特殊的操作。
过滤器的作用:一般完成通用的操作,如登陆验证,统一编码处理,敏感字符过滤…
2. 快速入门
- 步骤:
- 定义一个类,实现Filter接口
- 复写方法
- 配置拦截路径
- 使用注解 @WebFilter
- 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("doFilter...被执行了");
HttpServletRequest request= (HttpServletRequest)servletRequest;
System.out.println(request.getRequestURI());
filterChain.doFilter(servletRequest, servletResponse);
System.out.println();
}
@Override
public void destroy() {
}
}
-
过滤器细节:
- 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:服务器启动后,会创建Filter对象,然后调用init方法,只执行一次,常用于加载资源
- doFilter:每一次请求被拦截时会被调用,执行多次
- destroy:在服务器正常关闭时,Filter对象会被销毁,destroy被执行,只执行一次,用于释放资源。
3. 过滤器配置详解
- 拦截路径配置:
- 具体资源路径:/index.jsp只有访问index.jsp资源时才会被拦截
- 拦截目录:/user/* 拦截/user目录下的所有资源
- *.jsp:请求所有带后缀名.jsp的资源都会被执行
- 拦截所有资源:/*
- 配置拦截方式:
- 注解配置
- REQUST:,默认值。浏览器默认请求
- FORWOARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
- web.xml配置
- 设置
<dispatcher></dispatcher>
标签即可,dispatcher标签在filter-mapping下
- 设置
- 注解配置
4. 过滤器链(配置多个过滤器)
- 过滤器执行顺序:如果有两个过滤器1和过滤器2
1. 过滤器1
2. 过滤器2
3. 请求资源执行
3. 过滤器2
4. 过滤器1 - 过滤器先后顺序问题:
- 注解配置:按照类名的字符串顺序去比较,小的先被执行,如AFilter比BFilter先执行
- web.xml配置:
<filter-mapping>
谁定义在上边,谁先执行
5. 案例
-
案例1_登录验证
需求:- 访问day17_case案例的资源。验证其是否登录
- 如果登录了,则直接放行。
- 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。
-
案例2_敏感词汇过滤
需求:- 对day17_case案例录入的数据进行敏感词汇过滤
- 敏感词汇参考《敏感词汇.txt》
- 如果是敏感词汇,替换为 ***
分析:
- 对request对象进行增强。增强获取参数相关方法
- 放行。传递代理对象
增强对象的功能:
设计模式:一些通用的解决固定问题的方式- 装饰模式
- 代理模式
概念:- 真实对象:被代理的对象
- 代理对象:
- 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
实现方式:- 静态代理:有一个类文件描述代理模式
- 动态代理:在内存中形成代理类
实现步骤:-
代理对象和真实对象实现相同的接口
-
代理对象 = Proxy.newProxyInstance();
-
使用代理对象调用方法。
-
增强方法
- 增强参数列表
- 增强返回值类型
- 增强方法体执行逻辑
-
项目地址:
https://github.com/liuzeyu12a/user_msg_manager
代理模式:https://blog.csdn.net/JAYU_37/article/details/105693166
Listener
1. 概念
- 事件监听机制,web的三大组件之一。
- 事件 :一件事情
- 事件源 :事件发生的地方
- *** :一个对象
- 注册监听:将事件、事件源、***绑定在一起。 当事件源上发生某个事件后,执行***代码
常用于监听服务器得启动,加载一些启动配置 。
2. 快速入门
***:
/** * 通过用于服务器启动一次性加载全局资源文件 */
//@WebListener
public class ContextLoaderListener implements ServletContextListener {
/** * 监听ServletContext对象创建,服务器启动后自动创建 * @param servletContextEvent */
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//1.获取资源路径
ServletContext servletContext = servletContextEvent.getServletContext();
String loaderConfig = servletContext.getInitParameter("loaderConfig");
//2.记载资源文件
String realPath = servletContext.getRealPath(loaderConfig);
//3.加载进内存
try {
FileInputStream stream = new FileInputStream(realPath);
System.out.println(stream);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("ServletContext创建.....");
}
/** * 监听ServletContext对象销毁后执行,服务器正常关闭后执行 * @param servletContextEvent */
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext销毁.....");
}
}
web.xml配置
<listener>
<listener-class>listener.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>loaderConfig</param-name>
<param-value>/WEB-INF/classes/application.xml</param-value>
</context-param>
拦截器,过滤器和***之间的区别
拦截器:对象干预(可以改变对象的属性和行为)
过滤器:对象收集(不可以改变对象的属性和行为)
***:对象记录(不可以改变对象的属性和行为)
过滤器,拦截器它们的区别:
- 过滤器是依赖于servlet,基于函数回调,拦截器是依赖于整个web框架,基于反射机制实现的,属于面向切面编程的一种应用。
- 拦截器只能对action请求起作用,而过滤器几乎可以请求起作用。
- 拦截器可以action上下文,而过滤器不能。
- 在action声明周期中,拦截器可以被调用多次,但是过滤器只能在容器初始化时调用一次
参考:https://blog.csdn.net/WB1224678/article/details/88870987
***和上面两个组件的差别最大:
***的实现主要还是依据事件,事件源和***,当事件源发送某些事件时,执行***代码,可以感知到application(应用程序),session(会话域),request(请求域)创建,销毁或者往中添加属性或修改时自动执行***的代码,可以用于监听网站在线人数,用户行为,初始化配置等(ServletContextListener)
<mark>执行顺序是</mark>
过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后