• 【Servlet】7:监听器和过滤器的原理和应用


    目录

    | 监听器

    监听器 基本概述

    ServletContextListener监听器

    ServletContextAttributeListener监听器

    监听器的应用场景

    | 过滤器

    过滤器 基本概述

    过滤器 实现步骤

    过滤器 应用场景


    本文章属于后端全套笔记的第三部分

    (更新中)【后端入门到入土!】Java+Servlet+JDBC+SSM+SpringBoot+SpringCloud 基础入门_m0_57265007的博客-CSDN博客一篇文章,后端入门到入土。包含 Java基础+高级、MySQL、JDBC、Servlet、SSM、SpringBoot、SpringCloud、项目 的笔记。https://blog.csdn.net/m0_57265007/article/details/127962617?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127962617%22%2C%22source%22%3A%22m0_57265007%22%7D一篇文章,后端入门到入土。包含 Java基础+高级、MySQL、JDBC、Servlet、SSM、SpringBoot、SpringCloud、项目 的笔记。https://blog.csdn.net/m0_57265007/article/details/127962617?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127962617%22%2C%22source%22%3A%22m0_57265007%22%7D

    | 监听器

    监听器 基本概述

    • 介绍

      • 监听器是一组来自于Servlet规范下接口,共有8个接口。在Tomcat存在servlet-api.jar包

      • 监听器接口需要由开发人员亲自实现Http服务器提供jar包并没有对应的实现类

      • 监听器的主要作用是:用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】

      • 待会儿我们会学习最重要的两个监听器:ServletContextListener、ServletContextAttributeListener

    • 复习:作用域对象

      • 在Servlet规范中,认为在服务端内存中可以在某些条件下为两个Servlet之间提供数据共享方案的对象,被称为【作用域对象】

      • 需要注意的是:Servlet规范下作用域对象: Cookie是作为浏览器缓存而存在的,不是作用域对象

      • 作用域对象有三个:ServletContext 全局作用域对象、HttpSession 会话作用域对象、HttpServletRequest 请求作用域对象


    ServletContextListener监听器

    简介

    • 作用:通过这个接口合法的监测 ServletContext全局作用域对象 被初始化时刻以及被销毁时刻

    • ServletContextListener接口实现类开发三大步骤

      1. 实现ServletContextListener接口

    public class ListenerClass implements ServletContextListener
    1. .

    2. 重写监听器监听事件处理方法:contextInitialized、contextDestroyed

    3. 在web.xml文件将监听器接口实现类注册到Http服务器

    1. <listener>
    2. <listener-class>监听器类listener-class>
    3. listener>

    监听事件处理方法:

    1. public void contextInitlized(); //全局作用域对象被Http服务器初始化被调用
    2. public void contextDestory(); //在全局作用域对象被Http服务器销毁时候触发调用

    示例

    1. public class ListenerClass implements ServletContextListener {
    2. @Override
    3. public void contextInitialized(ServletContextEvent sce) {
    4. System.out.println("全局作用域对象 ServletContext 被创建");
    5. }
    6. @Override
    7. public void contextDestroyed(ServletContextEvent sce) {
    8. System.out.println("全局作用域对象 ServletContext 被销毁");
    9. }
    10. }

    1. public class S1 extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. }
    5. }

     

    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. <servlet>
    7. <servlet-name>S1servlet-name>
    8. <servlet-class>S1servlet-class>
    9. servlet>
    10. <servlet-mapping>
    11. <servlet-name>S1servlet-name>
    12. <url-pattern>/S1url-pattern>
    13. servlet-mapping>
    14. <listener>
    15. <listener-class>ListenerClasslistener-class>
    16. listener>
    17. web-app>

     

     

    ServletContextAttributeListener监听器

    简介

    • 作用:通过这个接口合法的监测 ServletContext全局作用域对象 共享数据变化时刻

    • ServletContextAttributeListener接口实现类开发三大步骤

      1. 实现ServletContextListener接口

    public class ListenerClass implements ServletContextAttributeListener

    1. 重写监听器监听事件处理方法:attributeAdded、attributeRemoved、attributeReplaced

    2. 在web.xml文件将监听器接口实现类注册到Http服务器

    监听事件处理方法:

    1. public void contextAdd(); //在全局作用域对象添加共享数据
    2. public void contextReplaced(); //在全局作用域对象更新共享数据
    3. public void contextRemove(); //在全局作用域对象删除共享数据

    示例

    1. public class ListenerClass2 implements ServletContextAttributeListener {
    2. @Override
    3. public void attributeAdded(ServletContextAttributeEvent scae) {
    4. System.out.println("检测到全局作用域对象数据有【新增】");
    5. }
    6. @Override
    7. public void attributeRemoved(ServletContextAttributeEvent scae) {
    8. System.out.println("检测到全局作用域对象数据有【删除】");
    9. }
    10. @Override
    11. public void attributeReplaced(ServletContextAttributeEvent scae) {
    12. System.out.println("检测到全局作用域对象数据有【修改】");
    13. }
    14. }

     

    1. public class S1 extends HttpServlet {
    2. @Override
    3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    4. ServletContext application = req.getServletContext();
    5. application.setAttribute("key1",100); //新增
    6. application.setAttribute("key1",200); //更新
    7. application.removeAttribute("key1"); //删除
    8. }
    9. }

     

    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. <servlet>
    7. <servlet-name>S1servlet-name>
    8. <servlet-class>S1servlet-class>
    9. servlet>
    10. <servlet-mapping>
    11. <servlet-name>S1servlet-name>
    12. <url-pattern>/S1url-pattern>
    13. servlet-mapping>
    14. <listener>
    15. <listener-class>ListenerClass2listener-class>
    16. listener>
    17. web-app>

     

     

    监听器的应用场景

    • 使用 ServletContextListener监听器,可在 contextInitlized( ) 方法内写上需要全局初始化的代码;可以在 contextDestroy( ) 方法内写上需要内存释放的代码

    • 使用ServletContextAttributeListener监听器,可以监测数据变动,从而编写相应的行为


    | 过滤器

    过滤器 基本概述

    • 介绍

      • 过滤器接口是来自于Servlet规范下接口,在Tomcat中存在于servlet-api.jar包

      • Filter接口实现类由开发人员负责编写,Http服务器不负责提供

      • Filter的作用:在Http服务器调用资源文件之前,对Http服务器进行拦截

    • 具体作用

      • 拦截Http服务器,帮助Http服务器检测当前请求合法性,若合法则放行

      • 拦截Http服务器,对当前请求进行增强操作


    过滤器 实现步骤

    • Filter接口实现类开发步骤:三步

      1. 创建一个Java类实现Filter接口(注意:有很多个Filter,我们要实现的是Sevlet的Filter)

      2. 重写Filter接口中doFilter方法

    1. public class FilterClass implements Filter {
    2. @Override
    3. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    4. }
    5. }

     3.web.xml将过滤器接口实现类注册到Http服务器

    1. <filter-mapping>
    2. <filter-name>oneFilterfilter-name>
    3. <url-pattern>拦截地址url-pattern>
    4. filter-mapping>

    (拦截地址通知Tomcat在调用何种资源文件之前需要调用OneFilter过滤进行拦截) 拦截地址的写法有很多,下面列举一些:

    1. <url-pattern>/img/mm.jpgurl-pattern>
    2. <url-pattern>/img/*url-pattern>
    3. <url-pattern>*.jpgurl-pattern>
    4. <url-pattern>/*url-pattern>

    过滤器 应用场景

    • 要求Tomcat在调用【某一个具体文件】之前,来调用OneFilter拦截:获取用户信息,判断条件,若条件不符合则拒绝用户访问目标文件

     

    要求Tomcat在调用【网站中任意文件】时,来调用OneFilter拦截:通知拦截的请求对象,使用UTF-8字符集进行编码(减少代码耦合度)

     

    要求Tomcat在调用【网站中任意文件】时,来调用OneFilter拦截:防止恶意登录(没有HttpSession就不给登录,只能注册)

     

    让与公共页面相关的页面无条件放行(即未登录、无HttpSession也能被访问)

     

     

  • 相关阅读:
    使C#语言编程更加高效的伎俩
    微服务介绍
    flutter 微信分享
    德语翻译器在线翻译中文-德语翻译器支持各大语言翻译
    C#使用DataTable的Select方法来选择特定的字段
    ASM使用小抄
    【Python 48小时速成 4】注释
    国庆作业5
    IDEA中,maven项目下,lombok插件 ,添加lombok.jar, Maven项目下lombok依赖配置
    当两项目上线时间接近,测试人员如何保障产品质量更好?
  • 原文地址:https://blog.csdn.net/m0_57265007/article/details/128006107