JavaEE-过滤器和监听器 案例分析

2023-11-06

过滤器和监听器

本文主要介绍过滤器和监听器的编程接口、基本结构、信息配置、部署和运行,最后通过案例说明过滤器和监听器的典型应用。

什么是过滤器

过滤器是web服务器上的组件,它们对客户和资源之间的请求和响应进行过滤。
过滤器的工作原理是:当servlet容器接收到对某个资源的请求,它要检查是否有过滤器与之关联。如果有过滤器与该资源关联,servlet容器将把该请求发送给过滤器。在过滤器处理完请求后,它将做下面3件事:
• 产生响应并将其返回给客户;
• 如果有过滤器链,它将把(修改过或没有修改过)请求传递给下一个过滤器;
• 将请求传递给不同的资源。
当请求返回到客户时,它是以相反的方向经过同一组过滤器返回。过滤器链中的每个过滤器够可能修改响应。
过滤器API主要包括:Filter、FilterConfig和FilterChain接口。

工作原理图:
工作原理

过滤器编程接口

进行过滤器编程用到javax.servlet.jar中的一组接口和类,下表只列出了与过滤器设计有关的三个重要接口,而与Servlet编程有关的接口、类未列。

功能 类和接口
Filter实现 javax.servlet.Filter
Filter配置 javax.servlet.FilterConfig
Filter链 javax.servlet.FilterChain

接口Filter的主要方法

  1. init()方法
    方法原型:
public void init(FilterConfig filterConfig) throws ServletException{}

该方法用于初始化过滤器,并获取web.xml文件中配置的过滤器初始化参数,默认情况下,服务器启动时就会加载过滤器,init方法就会执行。
该方法有一个FilterConfig类型的参数,利用它可以获取在web.xml中设置的过滤器的初始化参数值。获取初始参数值的方法为:

public String getInitParameter(String paraName)

过滤器的信息配置将在稍后介绍。
2. doFilter()方法
方法原型:

public void doFilter(ServletRequest request,  ServletResponse response,FilterChain filterChain) throws IOException,ServletException{}

当请求地址和过滤地址匹配时将进行过滤操作,该方法被执行。
第1个参数为ServletRequest对象,此对象给过滤器提供了对请求信息(包括表单数据、Cookie和HTTP请求头)的完全访问。
第2个参数为ServletResponse,用于响应请求。
第3个参数为FilterChain对象,使用该参数对象调用Servlet、JSP页面或者过滤器链中的下一个过滤器。
调用方法为:

public void doFilter(ServletRequest request, ServletResponse response)
  1. destroy()方法
    方法原型:
public void destroy()

Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源。
性质等同于Servlet的destory()方法。这些方法构成了过滤器对象的生命周期:创建、执行过滤方法、销毁。

设计过滤器

过滤器的设计需要实现Filter接口,并要根据处理的功能需要,实现Filter接口中的上述3个方法。
在开发环境下创建过滤器是很方便的,其创建过程:

  • 创建实现Filter接口的类:在项目的src下,创建一个或多个过滤器,并采用“包”结构的方式组织所有的过滤器。
  • 实现init方法,读取过滤器的初始化函数。
  • 将过滤行为放入doFilter()方法中:实现doFilter(),完成该过滤器所需要过滤功能。
  • 调用filterchain对象的doFilter方法:filterChain对象是过滤器接口的doFilter方法的一个参数,调用Filterchain的doFilter方法时,下一个关联的过滤器将被调用,若没有其他与Servlet或JSP相关联的过滤器,就调用Servlet或JSP本身。
  • 将过滤器与特定的Servlet或JSP页面关联:使用部署配置文件(web.xml)中的filter元素和filter-mapping元素。
实例1:编写一个过滤器审计用户对资源的访问
  1. 创建实现Filter接口的类AuditFilter:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
package filter;

import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;

public class AuditFilter implements Filter {

    protected FilterConfig config;

    public void init(FilterConfig filterConfig)
            throws ServletException {
        this.config = filterConfig;
    }

    public void doFilter(ServletRequest request,
            ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        String addr = req.getRemoteAddr();
        String user = req.getRemoteHost();
        config.getServletContext().log("RemoteAddress:" + addr
                + ",RemoteHost:" + user);
        chain.doFilter(req, res);
    }

    public void destroy() {
    }
}
  1. 在web.xml中配置过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" 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_3_1.xsd">
    <filter>
        <filter-name>AuditFilter</filter-name>
        <filter-class>filter.AuditFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AuditFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

有的编译器会在创建过滤器的时候就把web.xml配置好了
3. 运行项目,并查看日志文件
访问该应用程序中的任何一个资源,如使用下面的URL访问index.html:
http://localhost:8080/JavaEE-2-FilterListener/index.html
然后打开<CATALINA_HOME>\logs目录中的localhost.2019-04-13.log文件中有下面一行(访问多个资源就会有多行)
CATALINA_HOME即tomcat的安装位置
在这里插入图片描述

什么是监听器

监听器是Web应用开发的一个重要组成部分。通过它可以监听Web应用的上下文信息、Servlet请求信息、Servlet会话信息,并自动根据不同情况,在后台调用相应的处理程序。利用监听器来对Web应用进行监听和控制的,极大地增强了Web应用的事件处理能力。
监听器运行机制:当服务器启动时,监听器自动加载(执行构造函数),特定事件发生时,容器自动调用相应监听器中对应的事件处理方法。

监听器编程接口

监听器编程要用到javax.servlet.jar中的一组监听接口和事件类。根据监听对象的不同,监听器划分为3种:
(1)ServletContext事件监听器:用于监听应用程序环境对象。
(2)HttpSession事件监听器:用于监听用户会话对象。
(3)ServletRequest事件监听器:用于监听请求消息对象。
在Servlet 2.4规范中共定义了6种事件类型和8个事件监听器接口,它们可以处理三种对象上的事件:

.
监听器接口与事件类
监听对象 监听器接口 监听事件
ServletContext ServletContextListener ServletContextEvent
ServletContextAttributeListener ServletContextAttributeEvent
HttpSession HttpSessionListener HttpSessionEvent
HttpSessionActivationListener
HttpSessionAttributeListener HttpSessionBindingEvent
HttpSessionBindingListener
ServletRequest ServletRequestListener ServletRequestEvent
ServletRequestAttributeListener ServletRequestAttributeEvent

设计监听器

  1. 实现合适的接口:监听器需要根据监听对象的不同,实现某个监听接口。
  2. 实现有关事件的方法:按所选择的监听器接口,实现该接口中的有关的方法。
  3. 获取对重要Web应用对象的访问:在事件处理方法中,可能会用到9个重要对象(分为3类):
    servlet上下文、变化后的servlet上下文属性的名称、变化后的servlet上下文属性的值。
    会话对象、变化后的会话属性的名称、变化后的会话属性的值。
    请求对象、变化后的请求对象属性的名称、变化后的请求对象属性的值。
  4. 使用这些对象:需要根据具体应用,选择有关的对象。例如,对于servlet上下文,可能会读取初始化参数(getInitParameter方法),存储数据供以后使用(setAttribute方法)和读取原先存储的数据(getAttribute方法)。
  5. 配置监听器:在web.xml中,利用listener元素和listener-class元素完成配置。
  6. 提供任何需要的初始化参数:servlet上下文监听器一般先读取servlet上下文的初始参数,并将这些参数作为所有servlet或JSP都可以使用的数据基础。在web.xml中使用context-param元素提供这些初始化参数的名称和值。
实例:编写一个HttpSession事件监听器用来记录当前在线人数

【分析】 在网站中经常需要进行在线人数的统计。过去的一般做法是结合登录和退出功能,即当用户登录的时候计数器加1,当用户点击退出按钮时计数器减1。这种处理方式存在两个缺点:一是用户正常登录后,可能会忘记点击退出按钮,而直接关闭浏览器,导致计数器减1的操作不会执行;二是该方法无法统计非登录的在线人数。
可以利用监听器来解决这个问题,实现更准确的在线人数统计功能。当一个浏览器第一次访问网站的时候,服务器会新建一个HttpSession对象,并触发HttpSession创建事件,如果注册了HttpSessionListener事件监听器,则会调用HttpSessionListener事件监听器的sessionCreated方法。相反,当这个浏览器用户注销或访问结束超时的时候,服务器会销毁相应的HttpSession对象,触发HttpSession销毁事件,同时调用所注册HttpSessionListener事件监听器的sessionDestroyed方法。这样,我们只需要在HttpSessionListener实现类的sessionCreated方法中让计数器加1,在sessionDestroyed方法中让计数器减1,就可实现网站在线人数的统计功能。

  1. 设计监听器类:OnlineListener.java
    在这里插入图片描述
    在这里插入图片描述
package listener;

import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * Web application lifecycle listener.
 *
 * @author YU
 */
public class OnlineListener implements ServletContextListener, HttpSessionListener {

    private static int count = 0;

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        count++;
        se.getSession().getServletContext().setAttribute(
                "onlineCount", new Integer(count));

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        count--;
        se.getSession().getServletContext().setAttribute(
                "onlineCount", new Integer(count));

    }
    
    public static int getOnlineCount(){
        return count;
    }
}


  1. 注册事件监听器
    修改web.xml文件,添加以下配置代码 :
<listener>
    <listener-class>listener.OnlineListener</listener-class>
</listener>

有的编译器会在创建监听器的时候就把web.xml配置好了。

  1. 显示在线人数的页面OnlineCount.jsp
<%-- 
    Document   : OnlineCount
    Created on : 2019-4-13, 10:27:24
    Author     : YU
--%>

<%@page import="listener.OnlineListener"%>
<%@ page  pageEncoding="UTF-8" %>
<html>
    <head><title>在线人数显示页面</title>  </head>
    <body> 
        <h2>当前的在线人数:<%=OnlineListener.getOnlineCount() %></h2>
    </body>
</html>

  1. 运行结果:
    在这里插入图片描述

本文介绍了过滤器和监听器。过滤器主要用来拦截用户请求,实现如权限检查、编码转换、加密等通用的“横向”模块;监听器主要用来监听Web应用的上下文信息、Servlet请求信息、Servlet会话信息,并根据不同的情况,在后台调用相应处理程序。给出了过滤器和监听器的设计方法及其应用案例。
项目文件已上传百度云:https://pan.baidu.com/s/1lycQKh2ZQO0K2VAmf7J6vQ

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaEE-过滤器和监听器 案例分析 的相关文章

  • 关于java数组的扩容问题

    这是一个java数组实例 对一个顺序数组插入一个数 很明显直接插入是不行的 因为java中数组是固定的 不变是不能动态扩容的 想要插入一个数必然要重新创建一个数组 其长度比原数组大 然后对其进行拷贝 接下来要做的工作就是在新数组里面实现插入
  • 一次学校实训总结

    总结 前言 1 Linux基本命令 2 编程开发经验 3 一点MQTT协议的小知识点 4 学习中遇到的一些问题 5 遗忘的知识点与待解决的疑惑 写在后面的话 前言 好久不见 本来说好要更哈工大那一版的操作系统的 现在看来要食言了 正在准备考
  • 监听竖线一直在底部vue2

    要做一个竖线固定在固定区域上 占满固定区域的顶部到底部 固定区域会有滚动条 滚动条滚动的时候竖线要跟随吧变化 首先看看效果 解决办法 body代码 div class liebiao div style height 100 width 1
  • HPC超算初识思维导图

    HPC是高性能计算 High Performance Computing 机群的简称 指能够执行一般个人电脑无法处理的大资料量与高速运算的电脑 其基本组成组件与个人电脑的概念无太大差异 但规格与性能则强大许多 现有的超级计算机运算速度大都可
  • 如何用Redis实现搜索接口

    大家如果是做后端开发的 想必都实现过列表查询的接口 当然有的查询条件很简单 一条 SQL 就搞定了 但有的查询条件极其复杂 再加上库表中设计的各种不合理 导致查询接口特别难写 然后加班什么的就不用说了 不知各位有没有这种感受呢 下面以一个例
  • 华为公司经典设计规范合集

    下载链接 华为公司经典设计规范合集资源 CSDN文库 目录
  • Feature Selective Anchor-Free Module for Single-Shot Object Detection

    参考 Feature Selective Anchor Free Module for Single Shot Object Detection 云 社区 腾讯云 摘要 提出了一种简单有效的单阶段目标检测模块 特征选择无锚定 FSAF 模块
  • 数据库及SQL----常用知识点总结

    数据库也是计算机类笔试面试中不可避免会遇到的考点 尤其是银行和部分传统软件类公司 这里根据整理的资料 对数据库的相关知识也做个总结吧 希望学过数据库但长时间不用的同学根据这些知识能够回忆和重拾 没学过的同学能掌握一些数据库的基础知识 第一节
  • osgEarth的Rex引擎原理分析(四十六)如何定制椭球体并进行椭球体间坐标转换

    目标 目标 四十五 中的108 可以用于CGCS2000和WGS84的坐标转换 osg EllipsoidModel默认创建wgs84椭球体 将CGCS2000和WGS84的经纬高坐标分别转换为XYZ 然后比较其差值 osg Coordin
  • 重装mac显示未能恢复服务器取得联系,mac重开电脑后显示重装提示解决办法

    nodejs定义函数的方法 test 163 home exenode part3 module exports more calc js module exports sum function var r hdu 1789 Doing H
  • auto类型推导

    auto的作用 auto是我在编码中经常使用到的C 11新特性之一 主要用于变量的自动类型推导 如auto num 3 则推导出num的类型为int32 t auto的优势 相较于原始的显式类型去声明变量类型 auto的优势有以下几点 au
  • java全局异常捕获处理

    description TODO Author Administrator Date 2021 3 29 Version 1 0 ControllerAdvice public class YjzdyExceptionHandler Exc
  • Windows10电脑文件自动同步备份工具有哪些?

    对于工作中的重要数据人们一般都会有备份的习惯 但是如果都是人工手动复制粘贴 那效率会非常低下 Windows10中电脑文件自动同步备份工作有哪些 工具1 FileYee 推荐值 软件优势 可同百度网盘 移动硬盘实现自动同步备份 功能说明 F
  • 浏览器同源策略

    什么是同源 如果两个 URL 的协议 protocol 端口 port 域名 host 都相同的话 则这两个 URL 是同源的 下表给出了与 URL http store company com dir page html 的源进行对比的示
  • 11.python解答2020年蓝桥杯省赛python组 寻找2020

    11 python解答2020年蓝桥杯省赛python组 寻找2020 问题描述 小蓝有一个数字矩阵 里面只包含数字 0 和 2 小蓝很喜欢 2020 他想找到这个数字矩阵中有多少个 2020 小蓝只关注三种构成 2020 的方式 同一行里
  • 爬虫逆向实战(34)-某视综数据(MD5、AES)

    一 数据接口分析 主页地址 某视综 1 抓包 通过抓包可以发现数据接口是 rank waiting fans 2 判断是否有加密参数 请求参数是否加密 通过查看 载荷 模块可以发现有一个sign参数 请求头是否加密 无 响应是否加密 通过查
  • C语言,实现字符串排序

    实现字符串排序 include
  • leaftlet 点击事件与取消事件

    var layerNear var mapClick function map on click getRange var getRange function e e latlng地图上点击的点 layerNear L marker e l
  • js 数组遍历的几种方式

    js数组 表示的是有序的数据集合 是一种特殊的对象 对象是无序的数据结合 for循环 for in for each for of es6中数组实例的keys values entries map everyvery等函数 1 for循环
  • [Pyhon大数据分析] 二.PyEcharts绘制全国各地区、某省各城市地图及可视化分析

    思来想去 虽然很忙 但还是挤时间针对这次YQ写个Python大数据分析系列博客 包括网络爬虫 可视化分析 GIS地图显示 情感分析 舆情分析 主题挖掘 威胁情报溯源 知识图谱 预测预警及AI和NLP应用等 希望该系列线上远程教学对您有所帮助

随机推荐

  • win下C++通过Clion部署yolov5——libtorch+yolov5

    libtorch yolov5 一 环境配置 二 下载官网例子 三 测试 3 1 创建项目 3 2 cmakelist txt编写 3 3 运行测试 一 环境配置 需要配置libtorch OpenCV 此处参考博文 clion配置libt
  • 3D扫描技术概览

    3D扫描技术概览 复制链接 楼主 eseedo 发表于 2016 11 22 17 14 26 408 0 只看该作者 内容概要 1 使
  • 黑马程序员 JAVA学习笔记 ——— 多线程

    android培训 java培训 期待与您交流 首先 先介绍一下 熟悉的进程 按下 ctrl alt del就可以看到进程这一选项卡 进程是一个正在执行中的程序 每个进程执行都有一个执行顺序 该顺序是一个执行路径 或叫做一个控制单元 而今天
  • Scala基础语法之Trait详解

    Scala系列学习笔记 Scala概述与开发环境配置 Scala基础学习之运算符 Scala基础学习之for循环和while循环 一文掌握scala中的方法和函数 Scala基础 类和对象 访问修饰符和构造器 Scala的继承和抽象类 本章
  • database Derby initial

    surf the site http db apache org derby derby downloads html you ll get more but first is download the lastest Derby derb
  • Linux 网络通讯 : smbd 命令详解

    smbd命令用于Samba服务器程序 smbd为Samba服务器程序 可分享文件与打印机等网络资源供Windows相关的用户端程序存取 语法 1 smbd aDhoP d lt 排错层级 gt i lt 范围 gt l lt 记录文件 gt
  • FPGA(三)——基于FPGA的SPI通讯协议实现

    一 SPI通讯基本原理 1 SPI通讯介绍 SPI Serial Perripheral Interface 串行外围设备接口 是 Motorola 公司推出的一种同步串行接口技术 SPI 总线在物理上是通过接在外围设备微控制器 PICmi
  • Docker快速安装RabbitMQ服务

    Docker快速安装RabbitMQ服务 快速开始 bin bash 建议保存为start sh脚本执行 docker run d hostname my rabbit name some rabbit restart always p 1
  • Java 基础入门篇(一):Java 概述

    文章目录 一 Java 概述 二 Java 的产品 JDK 2 1 JDK 安装 2 2 Java与 Javac 介绍 2 3 Java 程序的开发步骤 三 Java 程序的执行原理 四 JDK 的组成 五 Java 的跨平台工作原理 一
  • Solidity transfer,call和send 的区别

    address transfer throws on failure forwards 2 300 gas stipend not adjustable safe against reentrancy should be used in m
  • SDF文件【简要说明】

    SDF Standard Delay Format 标准延时格式文件 常用延迟反标注 该文件包含了仿真用到的所有 IOPATH INTERCONNECT的延时 线延时 INTERCONNECT fsm block U27 Q fsm blo
  • 2020-10-10

    闭包和装饰器 1 高阶函数 接收函数作为参数是高阶函数 将函数作为返回值返回的函数就是高阶函数 2 匿名函数 lambda函数 无名函数 语法 lambda 参数列表 表达式 filter 函数 过滤列表 第一个参数 函数 第二个参数 序列
  • Java设计模式(十四)—— 模板方法模式

    模板方法模式是指定义一个操作中算法的骨架 而将一些步骤延迟到子类中 模板方法使子类可以不改变一个算法的结构 即可重定义该算法的某些特定步骤 适合模板方法模式的情景如下 编制一个通用算法 将某些步骤的具体实现留给子类来实现 需要重构代码 将各
  • 对Linux svn保存的明文密码加密

    需求来源 随着GitHub GitLab的兴起 svn已经渐渐的没落了 从公司当初的源代码管理服务器 逐渐演变成公司的ftp服务器 最近需要部署gitlab的CI单元测试模块 而软件版本都在svn上有备份 我就希望从代码的提交 gt 到版本
  • Python统计文本数字,字母,单词量

    统计一百万位圆周率中数字0 9各自的数量 统计一本书中字母a z各自的数量 统计一本书共有多少个单词 含重复的单词 和单词量 不含重复的单词 import string class CountNums 求txt文本中数字或字母的数量 def
  • Jvm类加载机制详解---类加载器及双亲委托模型

    前面介绍了类加载的几个过程 实际中这些过程大部分都是由虚拟机本身去执行的 我们没有办法去改变或影响这些过程的执行 但是虚拟机团队将类加载阶段第一步中的 通过一个类的全限定名来获取描述该类的二进制字节流 这个动作放到虚拟机外部去实现 以便让应
  • 使用R语言绘制ovarian数据集中病例年龄分布的直方图

    使用R语言绘制ovarian数据集中病例年龄分布的直方图 直方图是一种常用的数据可视化工具 用于展示连续变量的分布情况 在R语言中 我们可以使用hist 函数轻松地创建直方图 本文将展示如何使用R语言绘制ovarian数据集中病例年龄的分布
  • String、StringBuffer和StringBuilder三者之间的区别

    最基本的区别就是String是一个字符串常量 长度不可改变 StringBuffer和StringBuilder是字符串变量 他们两个的长度可以改变 但StringBuffer是线程安全的 而StringBuilder是非线程安全的 Str
  • ** LeetCode 刷题 459

    这是一道我没做出来的简单题 5555 学习 方法1 移动匹配 如果一个字符串可以由一个字串重复获得 那么将两个相同字符串并起来 一定可以在中间再找到该字符串 class Solution public bool repeatedSubstr
  • JavaEE-过滤器和监听器 案例分析

    目录 过滤器和监听器 什么是过滤器 过滤器编程接口 接口Filter的主要方法 设计过滤器 实例1 编写一个过滤器审计用户对资源的访问 什么是监听器 监听器编程接口 设计监听器 实例 编写一个HttpSession事件监听器用来记录当前在线