深入理解JavaWeb(五)——过滤器和监听器
摘要:在基于Java-Web核心技术的开发应用中,为了一些特定的用途或目的,那么Filter和Listener就要闪亮登场了。在本文中我们来聊一聊Servlet规范中的另俩技术的核心知识点,即过滤器和监听器。
作者:来自ArimaMisaki创作
文章目录
- 深入理解JavaWeb(五)——过滤器和监听器
- 7 Filter
- 7.1 Filter概述
- 7.2 Filter基本使用
- 7.3 Filter执行流程
- 7.4 Filter使用细节
- 7.5 过滤器链
- 7.6 Listener
7 Filter
7.1 Filter概述
说明:Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一;过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能,如权限控制、统一编码处理、敏感字符处理等等。
提示:实际上,过滤器交给前端来做比较好。
7.2 Filter基本使用
使用:
- 定义类并实现Filter接口(javax.servlet.Filter),并重写所有方法
- 配置Filter拦截资源的路径,在类上定义
@WebFilter
注解 - 在doFilter方法中输出一句话,并放行
步骤演示:
-
新建一个filterDemo类,接上接口,重写方法,加上注解
package web.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException;@WebFilter("/*") public class FilterDemo implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("FilterDemo");}public void destroy() {} }
-
新建一个hello.jsp文件
<%--Created by IntelliJ IDEA.User: ArimaMisakiDate: 2022/10/4Time: 14:03To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body><h1>hello jsp</h1><%System.out.println("hello jsp~");%> </body> </html>
-
开启服务,访问hello.jsp,发现由于没有在doFilter中放行,导致被拦截
-
修改拦截类,添加放行
package web.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException;@WebFilter("/*") public class FilterDemo implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("FilterDemo");filterChain.doFilter(servletRequest, servletResponse);}public void destroy() {} }
-
重新执行步骤3
7.3 Filter执行流程
说明:在开启服务时,我们可以在拦截的前后都设置处理逻辑,相当于你在地铁站检票,在进站口检票通过了(放行前)允许(放行)进地铁(访问资源),出来还要刷一次出站票(放行后)。
总结来看就是:执行放行前逻辑-》放行-》访问资源-》执行放行后逻辑
7.4 Filter使用细节
说明:可以根据不同的需求配置不同的路径来对资源进行拦截
- 拦截具体的资源:/index.jsp
- 目录拦截:/user/*
- 后缀名拦截:*/.jsp
- 拦截所有:/*
7.5 过滤器链
说明:一个Web应用可以配置多个过滤器,这多个过滤器称为过滤器链;其中多个过滤器一起使用时需要清楚执行流程,如果你对递归有着足够的熟悉,理解这个对你来说就不是什么难事;此外,通过注解配置的Filter,多个过滤器的先后顺序是按照类名的自然排序(26个字母的排序方式)来确定的。
7.6 Listener
说明:监听器可以监听application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。但由于在现代开发中已经很少使用Listener了,故这里不做过多讲解。
分类:
监听器分类 | 监听器名称 | 作用 |
---|---|---|
ServletContext监听 | ServletContextListener | 用于对ServletContext对象进行监听 |
ServletContextAttributeListener | 对ServletContext对象中的属性的监听 | |
Session监听 | HttpSessionListener | 对Session对象的整体状态监听 |
HttpSessionAttributeListener | 对Session对象中的属性监听 | |
HttpSessionBindingListener | 监听对象在Session的绑定和解除 | |
HttpSessionActivationListener | 对Session数据的钝化和活化的监听 | |
Request监听 | ServletRequestListener | 对Request对象进行监听 |
ServletRequestAttributeListener | 对Request对象中属性的监听 |
使用:在使用的时候,只需创建类,接上对应监听器接口,并且重写方法,最后加上@WebListener注解即可使用。