javaweb(11) Listener监听器与Filter过滤器
Listener监听器
什么是Listener监听器
- Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器
- Listener 它是 JavaEE 的规范,就是接口
- 监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。
ServletContextListener监听器
-
ServletContextListener 它可以监听 ServletContext 对象的创建和销毁。
-
ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁。
-
监听到创建和销毁之后都会分别调用 ServletContextListener 监听器的方法反馈。
-
两个方法:
public void contextInitialized(ServletContextEvent sce); public void contextDestroyed(ServletContextEvent sce);
-
如何使用ServletContextListener监听器监听ServletContext对象:
- 编写一个类去实现 ServletContextListener
- 实现其两个回调方法
- 到 web.xml 中去配置监听器
监听器实现类:
web.xml中的配置:
Filter过滤器
基本介绍
- Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
- Filter 过滤器它是 JavaEE 的规范。也就是接口
- Filter 过滤器它的作用是:拦截请求,过滤响应。
拦截请求的常见场景有:
- 权限检查
- 日记操作
- 事务管理等
Filter的基本使用
- 要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件、等等)都必须是用户登录之后才允许访问。
具体步骤示例
-
创建一个类去实现filter接口,重写doFilter方法
public class AdminFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //专门用于拦截请求,过滤响应 //权限检查 HttpServletRequest request = (HttpServletRequest) servletRequest; Object username = request.getSession().getAttribute("username"); if (username == null){ servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse); }else { //让程序继续访问要访问的资源 filterChain.doFilter(servletRequest, servletResponse); } } }
-
配置web.xml文件
<!--filter标签用于配置一个filter过滤器--> <filter> <!--给filter起一个别名--> <filter-name>AdminFilter</filter-name> <!--配置filter的全类名--> <filter-class>com.deserts.filter.AdminFilter</filter-class> </filter> <!--配置filter的拦截路径--> <filter-mapping> <!--表示该拦截路径给哪个filter类使用--> <filter-name>AdminFilter</filter-name> <!--配置拦截路径--> <url-pattern>/admin/*</url-pattern> </filter-mapping>
完整流程描述
- 当用户要访问过滤器filter所配置的资源路径时,会先经过实现了Filter接口的类AdminFilter,然后执行Filter进检查权限,如果用户名为空,转发到用户登录的页面;如果已登录,执行filterChain.doFilter(servletRequest, servletResponse);继续访问
Filter的生命周期
FilterConfig类
作用
- 获取 Filter 的名称 filter-name 的内容
- 获取在 Filter 中配置的 init-param 初始化参数
- 获取 ServletContext 对象
示例
FilterChain过滤链
- 在上述权限检查的过程中,当用户已登录,执行filterChain.doFilter(servletRequest, servletResponse)时,若有其它的Filter实现类同样配置了路径去拦截该资源,会继续执行下一个Filter类,多个Filter类都配置了要访问的资源路径时,执行顺序由web.xml从上到下的执行顺序决定。
- FilterChain.doFilter()方法的作用:
- 执行下一个filter过滤器(如果有)
- 执行目标资源(如果没有下一个过滤器)
- 多个Filter执行的特点
- 所有filter和目标资源默认都执行在同一个线程中
- 多个filter共同执行的时候,它们都使用同一个filter对象
Filter的拦截路径
-
精确匹配
-
目录匹配
-
后缀名匹配