• JavaWeb——Filter(过滤器)&Listener(监听器)


    目录

    1、Filter概述

    1.1、什么是Filter

    1.2、Filter原理 

    1.3、过滤器快速入门

    1.4、Filter的生命周期

    1.5、拦截路径

    1.6、doFilter方法

    1.7、使用注解形式

    2、Listener

    2.1、什么是Listener

    2.2、监听器的作用

    2.3、Servlet监听器

    2.4、Listener快速入门

    2.5、案例——统计网站在线人数


     

    web的三大组件

    servlet(控制器)
    filter(过滤器)
    listener(监听器

    1、Filter概述

    1.1、什么是Filter

    当用户访问服务器资源时,过滤器将请求拦截下来,完成一些通用的操作。

    应用场景:登录验证、统一编码处理、敏感字符过滤。

    作用:过滤掉请求的路径。

    1.2、Filter原理 

    1.3、过滤器快速入门

    定义一个类来实现Filter接口,并重写init、doFilter、destroy三个方法。

    1. public class MyFilter implements Filter {
    2. @Override
    3. public void init(FilterConfig filterConfig) throws ServletException {
    4. System.out.println("init");
    5. }
    6. @Override
    7. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    8. System.out.println("doFilter");
    9. }
    10. @Override
    11. public void destroy() {
    12. System.out.println("destroy");
    13. }
    14. }

    在web.xml配置文件中配置

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <filter>
    7. <filter-name>MyFilterfilter-name>
    8. <filter-class>cn.itssl.filter.MyFilterfilter-class>
    9. filter>
    10. <filter-mapping>
    11. <filter-name>MyFilterfilter-name>
    12. <url-pattern>/hello.htmlurl-pattern>
    13. filter-mapping>
    14. web-app>

    1.4、Filter的生命周期

    init方法

    服务器启动项目加载,创建filter对象,执行init方法(只执行一次)

    doFilter方法 

    用户访问被拦截目标资源时,执行doFilter方法,执行多次

    destroy方法 

    在服务器关闭前,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源。

    注意:过滤器一定是优先于Servlet创建的。 

    Filter生命周期和Servlet生命周期对比:

    Filter生命周期:
        1、当服务器启动时就初始化
        2、每次请求都会走doFilter方法,
        3、服务器正常关闭,Filter销毁 
    Servlet生命周期:
        1、用户第一次访问时servlet初始化,并且只初始化一次
        2、每次请求都会走service方法,
        3、服务器正常关闭,Servlet销毁 

    1.5、拦截路径

    在开发时,我们可以指定过滤器的拦截路径来定义拦截目标资源的范围

    精准匹配

    用户访问指定目标资源(/show.jsp)时,过滤器进行拦截

    目录匹配

    用户访问指定目录下(/user/*)所有资源时,过滤器进行拦截

    后缀匹配

    用户访问指定后缀名(*.html)的资源时,过滤器进行拦截

    匹配所有

    用户访问该网站所有资源(/*)时,过滤器进行拦截

    1. <filter>
    2. <filter-name>MyFilterfilter-name>
    3. <filter-class>cn.itssl.web.MyFilterfilter-class>
    4. filter>
    5. <filter-mapping>
    6. <filter-name>MyFilterfilter-name>
    7. <url-pattern>/hello.htmlurl-pattern>
    8. <url-pattern>/UserServleturl-pattern>
    9. <url-pattern>/show.jspurl-pattern>
    10. <url-pattern>*.htmlurl-pattern>
    11. filter-mapping>

    1.6、doFilter方法

    chain.doFilter(request,response) 放行、执行后续组件。

    1. package cn.itssl.web;
    2. import javax.servlet.*;
    3. import javax.servlet.http.HttpServletRequest;
    4. import javax.servlet.http.HttpServletResponse;
    5. import java.io.IOException;
    6. /**
    7. * @Auther: itssl
    8. * @Date: 12:07
    9. * @Desc
    10. */
    11. public class MyFilter implements Filter {
    12. @Override
    13. public void init(FilterConfig filterConfig) throws ServletException {
    14. System.out.println("--init--");
    15. }
    16. @Override
    17. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    18. System.out.println("--doFilter--");
    19. //默认不放行
    20. //我不仅要拦截还要放行
    21. HttpServletRequest request = (HttpServletRequest) servletRequest;
    22. HttpServletResponse response = (HttpServletResponse) servletResponse;
    23. //获取资源的请求路径
    24. String path = request.getRequestURI().substring(request.getContextPath().length());
    25. //判断请求路径是否满足
    26. if("/hello.html".equals(path) || "/userServlet".equals(path)){
    27. //放行实现
    28. filterChain.doFilter(request,response);
    29. }
    30. }
    31. @Override
    32. public void destroy() {
    33. System.out.println("--destroy--");
    34. }
    35. }

    1.7、使用注解形式

    使用注解形式,可以省去配置web.xml的过程,直接在类上面写@WebFilter注解,里面书写拦截的路径。

    1. @WebFilter(urlPatterns = "/*")
    2. public class MyFilter implements Filter {
    3. @Override
    4. public void init(FilterConfig filterConfig) throws ServletException {
    5. }
    6. @Override
    7. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    8. }
    9. @Override
    10. public void destroy() {
    11. }
    12. }

    2、Listener

    2.1、什么是Listener

    在我们的java程序中,有时也需要监视某些事情,一旦被监视的对象发生相应的变化,我们应该采取相应的操作。

    使用场景:

    历史访问次数、统计在线人数、系统启动时初始化配置信息。

    2.2、监听器的作用

    1、监听作用域对象的创建和销毁。    
        * ServletRequestListener:监听请求对象的创建和销毁 。
        * HttpSessionListener:监听会话对象(session)的创建和销毁 。
        * ServletContextListener:监听应用的创建和销毁。
    2、监听作用域对象的属性的添加、删除、替换。

    2.3、Servlet监听器

    第一类:监听三个数据范围对象(request、session、ServletContext)的创建和销毁监听器

         ServletContextListener 监听ServletContext 对象的创建和销毁
         HttpSessionListener  监听session 创建和销毁
         ServletRequestListener 监听request 对象创建和销毁 
     
    第二类:监听三个数据范围对象中属性变更(增加、替换、删除)的监听器

         setAttribute() removeAttribute()
         ServletContextAttributeListener, 监听ServletContext 对象属性的变更 
         HttpSessionAttributeListener  监听session 对象属性变更
         ServletRequestAttributeListener 监听request对象的属性变更 

    2.4、Listener快速入门

    首先需要定义一个类来实现ServletContextListener监听器

    1. public class MyServletContextListener implements ServletContextListener{
    2. // Public constructor is required by servlet spec
    3. public MyServletContextListener() {
    4. }
    5. public void contextInitialized(ServletContextEvent sce) {
    6. System.out.println("ServletContextListener创建了...........");
    7. }
    8. public void contextDestroyed(ServletContextEvent sce) {
    9. System.out.println("ServletContextListener销毁了...........");
    10. }
    11. }

    配置web.xml文件 

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    5. version="3.1">
    6. <listener>
    7. <listener-class>com.itssl.listener.MyServletContextListenerlistener-class>
    8. listener>
    9. web-app>

    2.5、案例——统计网站在线人数

    有用户使用网站,在线人数就+1;用户退出网站,在线人数就-1

    定义一个类用来监听整个项目,也是整个域,实现ServletContextListener接口

    1. @WebListener
    2. public class InitNumberListener implements ServletContextListener {
    3. public InitNumberListener() {
    4. }
    5. public void contextInitialized(ServletContextEvent sce) {
    6. ServletContext servletContext = sce.getServletContext();
    7. servletContext.setAttribute("number", 0);
    8. }
    9. public void contextDestroyed(ServletContextEvent sce) {
    10. }
    11. }

    定义一个类实现HttpSeesionListener接口,用来监听session域的创建和销毁 

    1. @WebListener
    2. public class NumberChangeListener implements HttpSessionListener {
    3. @Override
    4. public void sessionCreated(HttpSessionEvent httpSessionEvent) {
    5. ServletContext servletContext = httpSessionEvent.getSession().getServletContext();
    6. int number = (int) servletContext.getAttribute("number");
    7. servletContext.setAttribute("number",number+1);
    8. }
    9. @Override
    10. public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
    11. ServletContext servletContext = httpSessionEvent.getSession().getServletContext();
    12. int number = (int) servletContext.getAttribute("number");
    13. servletContext.setAttribute("number",number-1);
    14. }
    15. }

    定义一个类,用来销毁session域,退出网页功能,让人数-1 

    1. @WebServlet("/logoutServlet")
    2. public class LogoutServlet extends HttpServlet {
    3. @Override
    4. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    5. // 处理post请求乱码问题
    6. request.setCharacterEncoding("utf-8");
    7. // 设置响应数据的编码
    8. response.setContentType("text/html;charset=utf-8");
    9. // 销毁
    10. request.getSession().invalidate();
    11. }
    12. @Override
    13. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    14. this.doPost(request, response);
    15. }
    16. }

    index.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>$Title$title>
    5. head>
    6. <body>
    7. 在线人数: ${number}
    8. <br>
    9. <a href="/logoutServlet">退出系统a>>
    10. body>
    11. html>
  • 相关阅读:
    IIOT&IMS背后究竟有哪些技术力量?听7位产业专家透彻解析
    Sentinel 滑动窗口实现原理(源码分析)
    【云原生之Docker实战】使用Docker部署phpMyAdmin数据库管理工具
    深度学习中的数据类型介绍:FP32, FP16, TF32, BF16, Int16, Int8 ...
    JAVA多态
    Cholesterol-PEG-FITC,Fluorescein-PEG-CLS,胆固醇-聚乙二醇-荧光素水溶性
    模块化讲解
    HTML5+CSS3+JS小实例:涟漪特效按钮
    利用postman完成JSON串的发送功能(springboot)
    软件考试:计算机组成原理: 指令&数据
  • 原文地址:https://blog.csdn.net/select_myname/article/details/127094788