Filter+Listener

news2024/12/24 20:33:08

文章目录

      • 1. Filter
        • 1.1 Filter快速入门
        • 1.2 Filter执行流程
        • 1.3 Filter拦截路径
        • 1.4 案例
      • 2. Listener

JavaWeb 三大组件

  • Servlet
    Servlet 是在服务器端执行的 Java 类,用于处理客户端请求和生成响应。它可以接收HTTP请求并返回HTTP响应,通常用于处理Web应用程序的业务逻辑。Servlet 运行在 Servlet 容器中,如 Tomcat 或 Jetty。
  • Filter
    过滤器是一种用于在请求到达 Servlet 之前或响应回传给客户端之前修改请求和响应的组件。它可以对请求进行预处理、过滤和修改,并对响应进行后处理。过滤器可以用于实现身份验证、日志记录、字符编码转换等功能,以及对请求和响应进行过滤与增强。
  • Listener
    监听器用于监听 Web 应用程序中的事件和状态变化,并在事件发生时执行相应的操作。常见的监听器包括 ServletContextListener(监听 Servlet 上下文的创建和销毁)、HttpSessionListener(监听会话的创建和销毁)和 ServletRequestListener(监听请求的创建和销毁)等。监听器可以用于执行初始化操作、资源管理、应用程序监控等。

1. Filter

过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

  • 如下图所示,浏览器可以访问服务器上的所有的资源(servlet、jsp、html等)
  • 而在访问到这些资源之前可以使过滤器拦截来下,也就是说在访问资源之前会先经过 Filter
    在这里插入图片描述

应用场景

  1. 身份验证和授权
    过滤器可用于验证用户身份和权限。它可以拦截请求,检查用户是否已登录或是否具有访问特定资源的权限。如果用户未经身份验证或权限不足,过滤器可以重定向到登录页面或返回相应的错误信息。
  2. 请求参数处理
    过滤器可以对请求参数进行预处理和验证。它可以检查请求参数的完整性、格式和有效性,并根据需要进行转换或修正。
  3. 日志记录和统计
    过滤器可以用于记录请求和响应的日志,以及收集应用程序的统计数据。
  4. 缓存和性能优化:
    过滤器可用于缓存静态内容或动态内容的部分结果,以提高应用程序的性能和响应速度。
  5. 异常处理:
    过滤器可以捕获并处理请求处理过程中的异常。它可以拦截异常,并根据需要生成适当的错误响应或执行特定的异常处理逻辑。

1.1 Filter快速入门

步骤:

  1. 定义类,实现Filter接口,重写其方法;
  2. 配置Filter拦截资源的路径:在类上定义 @WebFilter 注解。而注解的 value 属性值 /* 表示拦截所有的资源
  3. 在doFilter方法中输出一句话,并放行
package com.filter;


import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

//2. 定义拦截路径
@WebFilter("/*")
public class FilterDemo1 implements Filter {

    //1.重写Filter接口中的三个方法
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter 被执行 FilterDemo1。。。。");

        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

在这里插入图片描述
在这里插入图片描述

1.2 Filter执行流程

在这里插入图片描述

Filter过滤器链

  1. 执行 Filter1 的放行前逻辑代码
  2. 执行 Filter1 的放行代码
  3. 执行 Filter2 的放行前逻辑代码
  4. 执行 Filter2 的放行代码
  5. 访问到资源
  6. 执行 Filter2 的放行后逻辑代码
  7. 执行 Filter1 的放行后逻辑代码

在这里插入图片描述

1.3 Filter拦截路径

  • 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
  • 目录拦截:/user/*:访问/user下的所有资源,都会被拦截
  • 后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
  • 拦截所有:/*:访问所有资源,都会被拦截

1.4 案例

访问服务器资源时,需要先进行登录验证,如果没有登录,则自动跳转到登录页面。
在这里插入图片描述

1.创建名为 LoginFilter 的过滤器

@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
      
    }

    public void init(FilterConfig config) throws ServletException {
    }

    public void destroy() {
    }
}

完成以下逻辑

  • 获取Session对象
  • 从Session对象中获取名为 user 的数据
  • 判断获取到的数据是否是 null * 如果不是,说明已经登陆,放行 * 如果是,说明尚未登陆,将提示信息存储到域对象中并跳转到登陆页面
package com.filter;


import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

//2. 定义拦截路径
@WebFilter("/*")
public class LoginFilter implements Filter {

    //1.重写Filter接口中的三个方法
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        //1. 判断session中是否有user
        HttpSession session = req.getSession();
        Object user = session.getAttribute("user");

        //2. 判断user是否为null
        if(user != null){
            // 登录过了
            //放行
            filterChain.doFilter(req, servletResponse);
        }else {
            // 没有登陆,存储提示信息,跳转到登录页面

            req.setAttribute("login_msg","您尚未登陆!");
            req.getRequestDispatcher("/login.jsp").forward(req,servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}

在这里插入图片描述
判断session中是否包含用户信息之前,应该加上对登陆及注册相关资源放行的逻辑处理

//判断访问资源路径是否和登录注册相关
//1,在数组中存储登陆和注册相关的资源路径
String[] urls = {"/login.jsp","/imgs/","/css/","/loginServlet","/register.jsp","/registerServlet","/checkCodeServlet"};
//2,获取当前访问的资源路径
String url = req.getRequestURL().toString(); 

//3,遍历数组,获取到每一个需要放行的资源路径
for (String u : urls) {
    //4,判断当前访问的资源路径字符串是否包含要放行的的资源路径字符串
    /*
    	比如当前访问的资源路径是  /brand-demo/login.jsp
    	而字符串 /brand-demo/login.jsp 包含了  字符串 /login.jsp ,所以这个字符串就需要放行
    */
    if(url.contains(u)){
        //找到了,放行
        chain.doFilter(request, response);
        //break;
        return;
    }
}

2. Listener

监听器可以监听就是在 applicationsessionrequest 三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/916812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DNDC模型土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用

查看原文>>>DNDC模型土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用 由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到,要…

“赛意力量SNP”南京站深探智改数转新境界 精典回顾

7月28日,“赛意力量全国行”来到中国科技的创新中心之一,同样也是专精特新“小巨人”成林的城市——江苏南京,以“芯片”为纽带,聚焦高科技企业未来发展的大方向,带领嘉宾深度挖掘智改数转领域的新思考与新路径。通过沙…

WordArt Designer:基于用户驱动与大语言模型的艺术字生成

AIGC推荐 FaceChain人物写真开源项目,支持风格与穿着自定义,登顶github趋势榜首! 前言 本文介绍了一个基于用户驱动,依赖于大型语言模型(LLMs)的艺术字生成框架,WordArt Designer。 该系统包含四个关键模块:LLM引擎、…

OpenCV中QR二维码的生成与识别(CIS摄像头解析)

1、QR概述 QR(Quick Response)属于二维条码的一种,意思是快速响应的意思。QR码不仅信息容量大、可靠性高、成本低,还可表示汉字及图像等多种文字信息、其保密防伪性强而且使用非常方便。更重要的是QR码这项技术是开源的,在移动支付、电影票、…

接口经典题目

​ White graces:个人主页 🙉专栏推荐:《Java入门知识》🙉 🙉 内容推荐:继承与组合:代码复用的两种策略🙉 🐹今日诗词:人似秋鸿来有信,事如春梦了无痕。🐹 目录 &…

7个好用的网络写作神器,助你提升写作能力

在如今数字化时代,网络写作已经成为许多人日常工作和创作的一部分。为了提高写作效率和质量,许多网络写作神器应运而生。本文将介绍7个优秀的网络写作工具,帮助你提升写作能力,提高创作效率,实现卓越的文笔。 …

(4)将固件加载到没有ArduPilot固件的主板上

文章目录 前言 4.1 下载驱动程序和烧录工具 4.2 下载ArduPilot固件 4.3 使用测试版和开发版 4.3.1 测试版 4.3.2 最新开发版本 4.4 将固件上传到自动驾驶仪 4.5 替代方法 4.6 将固件加载到带有外部闪存的主板上 前言 ArduPilot 的最新版本(Copter-3.6, Pl…

HTML总结1【转】

以下内容转载和参考自:w3school的HTML学习内容,HTML 简介 。 一、概述 HTML不是一种编程语言,它是超文本标记语言 (Hyper Text Markup Language),使用标记标签来描述网页内容。HTML标签是由尖括号包围的关键词,标签通…

MacBook怎么安装使用Windows软件和虚拟机?

作为一名MacBook用户,你可能会发现有些软件和应用程序只适用于Windows操作系统,但别担心!今天我们将介绍两种方法,让你的MacBook轻松安装Windows软件和运行Windows虚拟机,为你的工作、学习和娱乐任务带来更多可能性。下…

利用TLS反调试

利用TLS反调试 今天说一下利用TLS提供的静态绑定回调函数来反调试 原理 首先说一下tls为什么可以反调试 一般我们调试时候是断点在oep(pe文件的程序入口点)上的,而tls回调函数会在加载可执行程序之前调用 首先简单描述一下程序的加载过程 …

solidity0.8.0的应用案例10:可升级合约

这个案例是代理合约的实际操作,代理合约实现了逻辑和数据的分离,就可以实现在生产环境中,轻松升级合约,这就是一个如何实际升级合约的案例。 实现一个简单的可升级合约,它包含3个合约:代理合约,…

Android app 打包发布之build.gradle 配置

配置描述:在build.gradle(:app)文件中配置 包含以下几个部分: plugins:引入的工具android:主要配置都在这个里面dependencies:依赖android.applicationVariants.all:打包输出路径和名称 看android配置&a…

Linux下的Shell编程——文本处理工具(五)

前言: Linux Shell是一种基本功,由于怪异的语法加之较差的可读性,通常被Python等脚本代替。既然是基本功,那就需要掌握,毕竟学习Shell脚本的过程中,还是能了解到很多Linux系统的内容。 Linux脚本大师不是…

Matplotlib学习笔记

Matplotlib数据可视化库 jupyter notebook优势 画图优势,画图与数据展示同时进行。数据展示优势,不需要二次运行,结果数据会保留。 Matplotlib画图工具 专用于开发2D图表以渐进、交互式方式实现数据可视化 常规绘图方法 子图与标注 想要…

Java使用MyBatis、JDBC批量插入数据

使用MyBatis、JDBC做大量数据插入 准备 表结构 CREATE TABLE tb_users (id varchar(255) NOT NULL,name varchar(100) DEFAULT NULL,age int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;MyBatis配置文件 <?xml version"1.0" enc…

Wireshark数据抓包分析之ARP协议

一、实验目的&#xff1a; 通过wireshark的数据抓包了解这个ARP协议的具体内容 二、预备知识: 1.Address Resolution Protocol协议&#xff0c;就是通过目标IP的值&#xff0c;获取到目标的mac地址的一个协议 2.ARP协议的详细工作过程&#xff0c;下面描述得非常清晰&#xff…

【蓝桥杯】 [蓝桥杯 2015 省 A] 饮料换购

原题链接&#xff1a;https://www.luogu.com.cn/problem/P8627 1. 题目描述 2. 思路分析 小伙伴们可以看看这篇文章~ https://blog.csdn.net/m0_62531913/article/details/132385341?spm1001.2014.3001.5501 我们这里主要讲下方法二的推导过程&#xff1a; 列方程。 设最…

选购Redshift工作站需要注意哪些方面?

GPU 渲染在过去几年中变得非常流行。这并不奇怪&#xff0c;这要归功于 GPU 功能的巨大进步。专为 Redshift 等 GPU 加速渲染引擎量身定制的经过良好优化的工作站可以实时生成高度详细的渲染。 Maxon Redshift 与许多行业领先的 3D 设计应用程序完美集成&#xff0c;使其成为建…

多线程——学习记录2

目录 单例模式两种单例写法饿汉式和懒汉式的区别 RuntimeTimer 计时器两个线程间的通信关键点&#xff1a;wait()线程等待 和 notify()随机唤醒等待的线程; 三个或三个以上间的线程通信关键点&#xff1a;notifyAll()唤醒所有线程 线程间通信需要注意的问题JDK1.5的新特性互斥锁…

RT-Thread学习——简介

简介 RT-Thread是一个实时操作系统&#xff0c;移植到stm32单片机上。 常见的操作系统&#xff1a; Windows、Linux、MAC安卓、IOS鸿蒙操作系统 RT-Thread是一个集实时操作系统&#xff08;RTOS&#xff09;内核、中间件组件和开发者社区于一体的技术平台。 RT-Thread也是…