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() {
}
}
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>
4.过滤器执行过程
- 执行过滤器
- 执行放行的资源(请求服务器的资源)
- 回来执行过滤器放行下方的代码
- 过滤器生命周期
- init:服务器启动后,会创建Filter对象,然后调用init方法,只执行一次,常用于加载资源
- doFilter:每一次请求被拦截时会被调用,执行多次
- destroy:在服务器正常关闭时,Filter对象会被销毁,destroy被执行,只执行一次,用于释放资源。
- 过滤器配置详解
- 拦截路径配置:
- 具体资源路径:/index.jsp只有访问index.jsp资源时才会被拦截
- 拦截目录:/user/* 拦截/user目录下的所有资源
- *.jsp:请求所有带后缀名.jsp的资源都会被执行
- 拦截所有资源:/*
- 配置拦截方式:
- 注解配置
- REQUST:,默认值。浏览器默认请求
- FORWOARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
- web.xml配置
- 设置标签即可,dispatcher标签在filter-mapping下
- 注解配置
- 拦截路径配置:
5.过滤器链(配置多个过滤器)
- 过滤器执行顺序:如果有两个过滤器1和过滤器2
- 过滤器1
- 过滤器2
- 请求资源执行
- 过滤器2
- 过滤器1
- 过滤器先后顺序问题:
- 注解配置:按照类名的字符串顺序去比较,小的先被执行,如AFilter比BFilter先执行
- web.xml配置:谁定义在上边,谁先执行
案例
-
案例1_登录验证
需求:- 访问day17_case案例的资源。验证其是否登录
- 如果登录了,则直接放行。
- 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。
-
案例2_敏感词汇过滤
需求:- 对day17_case案例录入的数据进行敏感词汇过滤
- 敏感词汇参考《敏感词汇.txt》
- 如果是敏感词汇,替换为 ***
分析:
- 对request对象进行增强。增强获取参数相关方法
- 放行。传递代理对象
增强对象的功能:
设计模式:一些通用的解决固定问题的方式- 装饰模式
- 代理模式
概念:- 真实对象:被代理的对象
- 代理对象:
- 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
实现方式:- 静态代理:有一个类文件描述代理模式
- 动态代理:在内存中形成代理类
实现步骤:-
代理对象和真实对象实现相同的接口
-
代理对象 = Proxy.newProxyInstance();
-
使用代理对象调用方法。
-
增强方法
- 增强方式:
- 增强参数列表
- 增强返回值类型
- 增强方法体执行逻辑
- 增强方式:
-
项目地址:
https://github.com/liuzeyu12a/user_msg_manager
Listener
- 概念:web的三大组件之一。
- 事件监听机制
- 事件 :一件事情
- 事件源 :事件发生的地方
- 监听器 :一个对象
- 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码
- 事件监听机制
监听器:
/**
* 通过用于服务器启动一次性加载全局资源文件
*/
//@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>