学 Java 开发怎么能不知道 Filter 与 Listener
1.1 过滤器
1.1.1 简介
Filter 也称之为过滤器,它是 Servlet 技术中最实用的技术之一。通过 Filter 技术,可以对 web 服务器管理的所有 web 资源:例如 JSP, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的通用功能。例如实现 URL 级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。 Filter 主要用于对用户请求进行预处理,也可以对 HttpServletResponse 响应进行后处理。Filter 的执行流程:Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再对服务器响应进行后处理。
1.1.2 Filter 的使用
① 定义一个类,实现接口 Filter 并复写方法
public class FilterDemo implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 主要功能都在 doFilter 方法内实现
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("我被拦截器拦截了....");
//放行
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
② 配置拦截路径
<!-- 使用 web.xml 配置 -->
<filter>
<filter-name>demo</filter-name>
<filter-class>com.software.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>demo</filter-name>
<!-- 拦截路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
// 使用注解配置
@WebFilter("/*")
1.1.3 拦截器生命周期
① init:在服务器启动后,会创建 Filter 对象,然后调用 init 方法。只执行一次。一般用于加载资源 ② doFilter:每一次请求被拦截资源时,会执行。执行多次 ③ destroy:在服务器关闭时,Filter 对象被销毁。如果服务器是正常关闭,则会执行 destroy 方法。只执行一次。一般用于释放资源
1.1.4 过滤器拦截路径
① 具体资源路径:/index.jsp
/findUser
只有访问 index.jsp 、findUser 时,过滤器才会被执行
② 拦截目录:/user/*
访问 user 目录下的所有资源时,过滤器都会被执行
③ 后缀名拦截:*.jsp
访问所有后缀名为 jsp 资源时,过滤器都会被执行
④ 拦截所有资源:/*
访问所有资源时,过滤器都会被执行
1.1.5 过滤器拦截方式
☞ 注解配置(设置 dispatcherTypes 属性)
// 浏览器直接请求 index.jsp 资源时,该过滤器会被执行
@WebFilter(value="/index.jsp", dispatcherTypes = DispatcherType.REQUEST)
// 只有转发访问 index.jsp 时,该过滤器才会被执行
@WebFilter(value="/index.jsp", dispatcherTypes = DispatcherType.FORWARD)
// 浏览器直接请求 index.jsp 或者转发访问 index.jsp。该过滤器都会被执行
@WebFilter(value="/*", dispatcherTypes = { DispatcherType.FORWARD, DispatcherType.REQUEST})
/*
* ① REQUEST:默认值。浏览器直接请求资源
* ② FORWARD:转发访问资源
* ③ INCLUDE:包含访问资源
* ④ ERROR:错误跳转资源
* ⑤ ASYNC:异步访问资源
*/
☞ web.xml 配置
<filter-mapping>
<filter-name>demo</filter-name>
<url-pattern>/*</url-pattern>
<!-- 可配置多个dispatcher标签 -->
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
1.1.6 过滤器链
FilterChain 称为过滤器链,web 应用中可以存在很多个 Filter 过滤器,多个 Filter 过滤器组合起来就是一个过滤器链,受同一个 FilterChain 管理。
☞ 执行流程图
☞ 执行先后顺序 注解配置:按照类名的字符串比较规则比较,值小的先执行。 web.xml 配置:谁定义在上边,谁先执行。
1.2 监听器
1.2.1 简介
web 监听器是一种 Servlet 中的特殊的类,它们能帮助开发者监听 web 中的特定事件,比如ServletContext、HttpSession、ServletRequest 的创建和销毁;或者监听变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控。框架底层已经帮助我们实现了,此处只做简要介绍。
1.2.2 监听器的使用
① 定义一个类,实现 ServletContextListener 接口,并复写方法
public class MyListener implements ServletContextListener {
/**
* ServletContext 对象被销毁之前会调用该方法
**/
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
}
/**
* ServletContext 对象创建后会调用该方法
**/
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
}
② 配置
<!-- web.xml 配置 -->
<listener>
<listener-class>com.software.listener.MyListener</listener-class>
</listener>
// 注解配置
@WebListener
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释