【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服务器

    <!--将监听器接口注册到Tomcat-->
    <listener>
        <listener-class>监听器类</listener-class>
    </listener>

监听事件处理方法:

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

示例

public class ListenerClass implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("全局作用域对象 ServletContext 被创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("全局作用域对象 ServletContext 被销毁");
    }
}

public class S1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>S1</servlet-name>
        <servlet-class>S1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>S1</servlet-name>
        <url-pattern>/S1</url-pattern>
    </servlet-mapping>

    <!--将监听器接口注册到Tomcat-->
    <listener>
        <listener-class>ListenerClass</listener-class>
    </listener>

</web-app>

 

 

ServletContextAttributeListener监听器

简介

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

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

    1. 实现ServletContextListener接口

public class ListenerClass implements ServletContextAttributeListener

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

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

监听事件处理方法:

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

示例

public class ListenerClass2 implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("检测到全局作用域对象数据有【新增】");
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        System.out.println("检测到全局作用域对象数据有【删除】");
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        System.out.println("检测到全局作用域对象数据有【修改】");
    }
}

 

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

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>S1</servlet-name>
        <servlet-class>S1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>S1</servlet-name>
        <url-pattern>/S1</url-pattern>
    </servlet-mapping>

    <!--将ListenerClass2监听器实现类注册到Tomcat-->
    <listener>
        <listener-class>ListenerClass2</listener-class>
    </listener>

</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方法

public class FilterClass implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        
    }
}

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

<filter-mapping>
    <filter-name>oneFilter</filter-name>
    <url-pattern>拦截地址</url-pattern>
</filter-mapping>

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

<!--要求Tomcat在调用【某一个具体文件】之前,来调用OneFilter拦截-->
<url-pattern>/img/mm.jpg</url-pattern>

<!--要求Tomcat在调用【某一个文件夹下所有的资源文件】之前,来调用OneFilter拦截-->
<url-pattern>/img/*</url-pattern>

<!--要求Tomcat在调用【任意文件夹下某种类型文件】之前,来调用OneFilter拦截-->
<url-pattern>*.jpg</url-pattern>

<!--要求Tomcat在调用【网站中任意文件】时,来调用OneFilter拦截-->
<url-pattern>/*</url-pattern>

过滤器 应用场景

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

 

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

 

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

 

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

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Graskli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值