filter(过滤器)

news2024/11/18 5:50:01

目录

一、过滤器应用场景

二、Filter:过滤器

 1. 快速入门

2. 过滤器执行流程

3. 过滤器生命周期方法

4. 过滤器配置详解

5. 过滤器链(配置多个过滤器)

三、监听器


一、过滤器应用场景

过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应.

应用场景: 判断用户是否登录、过滤器请求记录日志、身份验证、权限控制等。

什么是过滤器 拦截过滤请求

过滤器可以 减少代码冗余性问题

二、Filter:过滤器

 1. 快速入门

 步骤:
        1. 定义一个类,实现接口Filter
        2. 复写方法
        3. 配置拦截路径
            1. web.xml
            2. 注解
@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
		public class FilterDemo1 implements 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("filterDemo1被执行了....");
 //放行
		        filterChain.doFilter(servletRequest,servletResponse);
		
		    }
		
		    @Override
		    public void destroy() {
		
		    }
		}

2. 过滤器执行流程

        (1)执行过滤器
        (2)执行放行后的资源
        (3)回来执行过滤器放行代码下边的代码

3. 过滤器生命周期方法

        (1) init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
        (2)doFilter:每一次请求被拦截资源时,会执行。执行多次
        (3) destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源

4. 过滤器配置详解

        * 拦截路径配置:
            (1)具体资源路径: /index.jsp   只有访问index.jsp资源时,过滤器才会被执行
            (2)拦截目录: /user/*    访问/user下的所有资源时,过滤器都会被执行
            (3)后缀名拦截: *.jsp        访问所有后缀名为jsp资源时,过滤器都会被执行
            (4)拦截所有资源:/*        访问所有资源时,过滤器都会被执行

        * 拦截方式配置:资源被访问的方式

            * 注解配置:
                * 设置dispatcherTypes属性
                    (1)REQUEST:默认值。浏览器直接请求资源
                    (2)FORWARD:转发访问资源
                    (3)INCLUDE:包含访问资源
                    (4) ERROR:错误跳转资源
                    (5)ASYNC:异步访问资源

            * web.xml配置
                * 设置<dispatcher></dispatcher>标签即可         

5. 过滤器链(配置多个过滤器)

        * 执行顺序:如果有两个过滤器:过滤器1和过滤器2
            (1)过滤器1
            (2)过滤器2
            (3) 资源执行
            (4) 过滤器2
            (5)过滤器1 

        * 过滤器先后顺序问题:
            (1)注解配置:按照类名的字符串比较规则比较,值小的先执行
                * 如: AFilter 和 BFilter,AFilter就先执行了。
            (2)web.xml配置: <filter-mapping>谁定义在上边,谁先执行

过滤器1执行完毕之后再执行过滤器2

注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序

使用过滤器验证会话信息

需求:使用过滤器验证用户的会话信息,判断用户是否已经登录 如果 没有登录的话 则跳转到登录页面。排查“loginServlet、RegisterServlet”

package com.mayikt.filter;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;


@WebFilter("/*")// 过滤器所有的请求
public class UserSessionFilter implements Filter {
    private String[] excludeUrls = new String[]{"/login", "/register", "/VerifycodeServlet"};
    
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 从session获取到用户的会话信息 判断用户是否登录过
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
        // 定义一个数组 哪些 请求是需要排除的
        for (int i = 0; i < excludeUrls.length; i++) {
            String excludeUrl = "/mayikt_session_war_exploded" + excludeUrls[i];
            String requestURI = httpServletRequest.getRequestURI();
            if (excludeUrl.equals(requestURI)) {
                // 放行请求
                filterChain.doFilter(httpServletRequest, httpServletResponse);
                return;
            }
        }
        // 排除请求
        HttpSession session = httpServletRequest.getSession();
        Object user = session.getAttribute("user");
        if (user == null) {
            // 当前用户没有登录或者登录会话失效
            // 重定向到登录页面
            httpServletResponse.sendRedirect("/mayikt_session_war_exploded/login");
            return;
        }
        // 用户已经登录了 正常放行请求
        filterChain.doFilter(httpServletRequest, httpServletResponse);
    }
}

获取当前上下文

request.contextPath();

三、监听器

* 概念:web的三大组件之一。
	* 事件监听机制
		* 事件	:一件事情
		* 事件源 :事件发生的地方
		* 监听器 :一个对象
		* 注册监听:将事件、事件源、监听器绑定在一起。 
                   当事件源上发生某个事件后,执行监听器代码
* ServletContextListener:监听ServletContext对象的创建和销毁
	
   * 方法:
		* void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
		* void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法

	* 步骤:
		1. 定义一个类,实现ServletContextListener接口
		2. 复写方法
		3. 配置
			1. web.xml
					<listener>
 					 <listener- 
                  class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
	           * 指定初始化参数<context-param>
			2. 注解:
				* @WebListener

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

2. Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等。

3. Listener实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等.

  (1)ServletContext监听

ServletContextListener:用于对Servlet整个上下文进行监听;

ServletContextAttributeListener:对Servlet上下文属性的监听。



  (2)Session监听

HttpSessionListener接口:对Session的整体状态的监听;

HttpSessionAttributeListener接口:对session的属性监听。


  (3)Request监听

ServletRequestListener:用于对Request请求进行监听;

ServletRequestAttributeListener:对Request属性的监听。

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

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

相关文章

基于Python机器学习、深度学习在气象、海洋、水文等技能提升教程

详情点击链接&#xff1a;基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用 前言 Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。…

经营简报及考核360表格

文章目录 经营简报效果图代码tableObjectSpanMethod.js 考核360委员会效果图 经营简报效果图不需要合并单元格且有汇总表头的 懒得封装了&#xff0c;所以整体没有封装 经营简报 效果图 代码 <template><el-tableref"tableRef":data"tableData.lengt…

基础实验篇 | CopterSim中回传提示消息实验

基础实验篇|CopterSim中回传提示消息实验 01实验名称及目的 回传提示消息实验&#xff1a;在飞控中&#xff0c;我们时常需要向外发布一些文字消息&#xff0c;来反映系统当前的运行状态&#xff0c;这个功能可以通过发送“mavlink_log”的uORB消息来实现。 02实验效果 在Cop…

如何让 ChatGPT 更懂你?新功能 Custom Instructions 尝试

对比 我们先来做一个对比实验。这里咱们让 ChatGPT 执行一个很简单的任务 —— 介绍一下 AI 生成内容&#xff08;AIGC&#xff09;。为了能够让 ChatGPT 查询资料&#xff0c;咱们给它提供了 Web Pilot 插件。但是 ChatGPT 并没有主动调用插件&#xff0c;而是直接给出了解释。…

Cisco IOS操作(红茶三杯CCNA)

Cisco IOS模式 &#xff1a;用户模式 #&#xff1a;特权模式(config)#&#xff1a;全局配置模式 接口模式&#xff1a;(config-if)#线路模式&#xff1a;(config-line)#路由配置模式&#xff1a;(config-router)# 使用CLI的帮助 - 命令提示及补全:?、Tab、命令关键字&…

【微信支付】Java微信支付流程

微信支付 微信支付流程 当我们需要支付一件商品时&#xff0c;首先从前端像后端传来商品ID&#xff0c;后端根据商品ID查询商品信息&#xff0c;然后封装订单信息&#xff0c;保存订单。下一步就是向微信远程调用支付接口&#xff0c;微信返回code_url&#xff0c;后端封装co…

vscode恢复被误删的文件(巧用本地历史记录)

背景&#xff1a;&#xff08;希望永远不要有这个背景&#xff09;使用vscode开发项目时&#xff0c;新建了文件&#xff0c;且文件没有git add、没有git stash、没有git commit。但是不小心点中了撤销更改&#xff08;新文件的撤销更改&#xff0c;其实就是删除该新文件&#…

【教学类-34-06】20230726拼图(“三角”凹凸拼图)3*4格子(中班主题《个别化拼图》偏美术)

图片展示&#xff1a; 圆形凹凸角变成三角形凹凸角&#xff0c;便于幼儿剪直线。 背景需求&#xff1a; 5月底&#xff0c;我自制凹凸角拼图&#xff08;动画片图片转拼图&#xff09;给幼儿裁剪&#xff0c;拼贴 教学实际操作时&#xff0c;发现圆形的凸角不适合幼儿裁剪&…

ROS 2 — 托管(生命周期)节点简介

一、说明 这篇文章是关于理解ROS 2中托管&#xff08;生命周期&#xff09;节点的概念。我们描述了概念性的想法以及我们为什么需要它。所以让我们开始吧&#xff01; 二、托管式节点 — 什么和为什么&#xff1f; 为了理解托管式节点&#xff0c;让我们从一个简单的问题陈述开…

微服务——服务异步通讯RabbitMQ

前置文章 消息队列——RabbitMQ基本概念容器化部署和简单工作模式程序_北岭山脚鼠鼠的博客-CSDN博客 消息队列——rabbitmq的不同工作模式_北岭山脚鼠鼠的博客-CSDN博客 消息队列——spring和springboot整合rabbitmq_北岭山脚鼠鼠的博客-CSDN博客 目录 Work queues 工作队列…

数据结构(c++实现)

数据结构 目录 数据结构1.链表实现单链表双链表 2.栈(先进后出&#xff0c;后进先出)3.单调栈4.队列&#xff08;先进先出&#xff09;5.单调队列6.小根堆操作 7.KMP8.Trie树(字典树) 1.链表实现 单链表 #include <iostream>using namespace std;const int N 100010;/…

AcWing 3708. 求矩阵的鞍点

输入样例&#xff1a; 3 4 1 2 3 4 1 2 3 4 1 2 3 4输出样例&#xff1a; 1 4 4 2 4 4 3 4 4 #include<bits/stdc.h> using namespace std; const int N1010; int n,m,a[N][N],x[N],y[N],flag1; int main(){scanf("%d%d",&n,&m);for(int i1;i<n;i…

抖音西瓜实时作品监控,一秒更新提醒

抖音西瓜实时作品监控&#xff0c;一秒更新提醒 安装必要的依赖库&#xff1a;使用pip安装aweme库。 pip install aweme 导入所需的库。 import datetime import time import schedule from aweme import API 创建一个函数&#xff0c;用于检查抖音作品是否更新。 def check_u…

端到端的视频编码方法及码率控制算法

文章目录 基于卷积神经网络的的端到端的视频编码方法自编码器 基于端到端学习的图像编码研究及进展变换量化熵编码 面向视频会议场景的 H.266/VVC 码率控制算法研究基于强化学习的视频码率自适应决策研究自适应流媒体传输技术码率自适应算法研究现状强化学习深度强化学习算法介…

mp4视频太大怎么压缩?教你轻松减小视频大小

MP4视频太大怎么办&#xff1f;很多人都会遇到这样的问题&#xff0c;MP4视频往因为画面清晰度高&#xff0c;画面流畅&#xff0c;所以视频文件会比较大&#xff0c;如果你想向朋友或者家人分享这个视频&#xff0c;但是又因为文件太大无法发送&#xff0c;那么怎么办呢&#…

可视化开发工具:让软件应用开发变得更轻松

一、前言 你是否为编程世界的各种挑战感到头痛&#xff1f;想要以更高效、简单的方式开发出专业级的项目&#xff1f; JNPF低代码工具正是你苦心寻找的产品&#xff01;它是一款专为稍微懂一点点编程思想的入门级人员设计的神奇工具&#xff0c;集成了丰富的功能和组件&#xf…

使用 CSS 自定义属性

我们常见的网站日夜间模式的变化&#xff0c;其实用到了 css 自定义属性。 CSS 自定义属性&#xff08;也称为 CSS 变量&#xff09;是一种在 CSS 中预定义和使用的变量。它们提供了一种简洁和灵活的方式来通过多个 CSS 规则共享相同的值&#xff0c;使得样式更易于维护和修改。…

深度剖析APP开发中的UI/UX设计

作为一个 UI/UX设计师&#xff0c;除了要关注 UI/UX设计之外&#xff0c;还要掌握移动开发知识&#xff0c;同时在日常工作中也需要对用户体验有一定的认知&#xff0c;在本次分享中&#xff0c;笔者就针对自己在工作中积累的一些经验来进行一个总结&#xff0c;希望能够帮助到…

暑假学生使用什么牌子台灯好?分享五款学生使用的台灯

临近暑假&#xff0c;是不是开始补课或写暑假作业了呢&#xff1f;是不是还在为选一款学生使用的台灯而发愁&#xff1f;今天小编就来给大家推荐几款台灯供大家参考参考。 那么问题来了&#xff0c;怎么选择合适的护眼台灯&#xff1f; 第一&#xff1a;先考虑个人预算选择适…

Modbus RTU通信应用

一、功能概述 1.1 概述 Modbus串行通信协议是Modicon公司在1970年开发的。 Modbus串行通信协议有Modbus ASCII和Modbus RTU两种模式&#xff0c;Modbus RTU协议通信效率较高&#xff0c;应用更加广泛。 Modbus RTU协议是基于RS232和RS485串行通信的一种协议&#xff0c;数据通…