javaWeb之过滤器(Filter)
目录
前言
过滤器概述
什么是过滤器
过滤器详细
过滤器的生命周期
过滤器的应用
创建一个简单的Filter类步骤
注意:指定拦截路径,我们有两种方式
实例
前言
本篇博客的核心
- 知道过滤器的整个拦截过程
- 知道如何指定拦截路径
- 知道过滤器的生命周期
过滤器概述
什么是过滤器
过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。
当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。
接下来,我画一幅图帮助大家理解
过滤器详细
过滤器的生命周期
我们之前学习过Servlet的生命周期。那么我先来复习一下Servlet
- 1 Servlet 创建:启动服务器,当浏览器访问servlet后,由服务器创建
- 2 Servlet 初始化:自动调用init 方法进行初始化,完成初始化操作
- 3 Servlet运行:调用service方法:运行
- 4 Servlet销毁: 在服务器关闭时,调用dertroy 方法 销毁Servlet对象,清除内存缓存
Filter 的生命周期
1 Filter 创建:启动服务器,由服务器自动创建
2 Filter 初始化:自动调用init(FilterConfig) 方法,完成初始化操作
3 Filter 运行:调用doFilter(ServletRequest req,ServletResponse res,FilterChain chain)方法
4 Filter 销毁 :在服务器关闭时,调用dertroy 方法 销毁Filter 对象,清除内存缓存
注意:在Filter 的生命周期中,像创建,初始化,销毁,都是服务器,帮我们做的。我们真正需要做的就是 学会重写doFilter(ServletRequest req,ServletResponse res,FilterChain chain)方法
根据实际的拦截需要,写方法体
大家请看Filter 的源码
package javax.servlet;import java.io.IOException;public interface Filter { // 一但,我们创建 该对象,就会立即调用init()方法,完成初始化default void init(FilterConfig filterConfig) throws ServletException {} // 实际操作,需要的方法void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; // 当关闭服务器,后,自动调用该方法,销毁该对象default void destroy() {} }
过滤器的应用
创建一个简单的Filter类步骤
- 0 添加Servlet jar包
- 1 创建一个实现类 ,实现Filter 接口
- 2 重写 doFilter ()方法
- 3 指定拦截路径
注意:指定拦截路径,我们有两种方式
1 通过xml 配置文件
2 通过注解方式
实例
写一个前端登录的表单,来测试 是否可以通过路径拦截?
本次,我使用的是 在xml 配置文件,添加拦截的路径
代码如下
- xml 配置文件中的代码
<?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"><filter><filter-name>loginFilter</filter-name><filter-class>fs.Filter.loginFilter</filter-class></filter><filter-mapping><filter-name>loginFilter</filter-name><url-pattern>/login/*</url-pattern></filter-mapping></web-app>
过程展示图如下:
运行结果大家是否发现:我在配置文件指定的路径:
<url-pattern>/login/*</url-pattern>按理来说,我们登录表单,请求路径是 / login 。因此我们也是要写成这样的,当提交表单后,我们写的Filter 类,指定的路径,如果是这个,那么刚好被拦截,判断是否满足条件,如果满足,就放行,让Servlet 来处理请求。
但我这里写成这种方式,其实是为了方便以后。如果之后你改了请求路径如 login121,login1等
都是可以被拦截的。我写的是前缀锁定。只有前缀是一样的,不管后面是什么,都会被拦截。
之前是在配置文件中指定拦截路径,现在我们也试一下注解方式
之前,我们是通过在xml配置文件 写拦截路径,是比较麻烦。这里有一种更方便的方式:通过注解来写拦截路径。
大家可以回忆之前,写Servlet 路径的注解。本质是一样的。我们使用注解本质上还剩在配置文件中,添加。只不过这个方式简单点,相对我们来说。
@WebServlet("/login/*")
之前说,如果满足Filter 拦截条件,就放行!,让servlet 去执行请求的业务
那么现在有个问题,应该怎么去放行,怎么体现“放行” 呢?
我们之前看源码的时候,注意到
doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 有一个参数 FilterChain filterChain我们要表示放行时,代码
filterChain.doFilter(servletRequest,servletResponse);大家请看实例,来理解
之前做一个简单的前后端项目,要求:登录,查看列表,修改,删除,添加功能
在这个项目中,只有登录成功后,才可以进行其他操作。
因此当我们点击查看列表,修改,删除,添加功能 前端界面时,都必须要看是否登录,如果没有登录,就会跳到登录界面。因此我们需要Filter 拦截,而拦截条件是 :是否登录。
我们写的Filter 类代码如下:
package fs.filter;import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.Objects;@WebFilter("/users/*") public class checkLoginFilter implements javax.servlet.Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req =(HttpServletRequest) servletRequest;HttpServletResponse resp=(HttpServletResponse) servletResponse;//验证登录是, 如果用户对象否为空if (Objects.nonNull(req.getSession().getAttribute("login"))){filterChain.doFilter(req,resp);}else {resp.sendRedirect("/login.jsp");}// 跳转到登录页面} }
看了代码发现:
把登录成功的用户对象用session域存起来
- 这样就可以在任意请求中使用,只要当前会话没有结束【浏览器没有关闭】
拦截路径,我使用了前缀锁定,这样就可以使用在多个请求地址不同的前端界面上
使用向下转型
- doFilter方法提供的参数 都是HttpServletRequest 或HttpServletResponse 类型 对象的父类,没有从域中获得数据的方法。
相关文章:

javaWeb之过滤器(Filter)
目录 前言 过滤器概述 什么是过滤器 过滤器详细 过滤器的生命周期 过滤器的应用 创建一个简单的Filter类步骤 注意:指定拦截路径,我们有两种方式 实例 前言 本篇博客的核心 知道过滤器的整个拦截过程知道如何指定拦截路径知道过滤器的生命周期…...

ModStartBlog v10.0.0 发布时间自定义,多图快速粘贴,博客编辑器升级
ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键快速安装 …...
Unexpected token ‘<‘, “<!doctype “... is not valid JSON
Unexpected token ‘<’, "<!doctype "… is not valid JSON 在前端开发时,遇到以下报错内容。 1.报错内容如下: // 报错内容 Uncaught (in promise) SyntaxError: Unexpected token <, "<!doctype "... is not valid…...

24/12/9 算法笔记<强化学习> PPO,DPPO
PPO是目前非常流行的增强学习算法,OpenAI把PPO作为目前baseline算法,首选PPO,可想而知,PPO可能不是最强的,但是是最广泛的。 PPO是基于AC架构,因为AC架构有一个好处,就是解决了连续动作空间的问…...

Linux下编译安装METIS
本文记录Linux下编译安装METIS的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1 一、安装依赖 1.1 下载GKlib sudo apt-get install build-essential sudo apt-get install cmake 2.2 编译安装GKlib 下载GKlib代码, …...

【数据库】关系代数和SQL语句
一 对于教学数据库的三个基本表 学生S(S#,SNAME,AGE,SEX) 学习SC(S#,C#,GRADE) 课程(C#,CNAME,TEACHER) (1)试用关系代数表达式和SQL语句表示:检索WANG同学不学的课程号 select C# from C where C# not in(select C# from SCwhere S# in…...

amazon亚马逊滑动识别验证码
注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/15 亚马逊的滑动还原验证码数据集如下: 和某顶象的差不多,图片分割高度是中间固定的,…...

Android Studio 创建虚拟设备的详细图文操作教程
本篇文章主要讲解 Android Studio 创建模拟器详细图文操作,包含了每一步的详细操作,便于理解和掌握对模拟的创建。 日期:2024年12月9日 作者:任聪聪 运行效果: 说明:创建运行后,点击右侧如下图…...
网络安全法-附则
第七章 附 则 第七十六条 本法下列用语的含义: (一)网络,是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息进行收集、存储、传输、交换、处理的系统。 (二)网络安全ÿ…...
CSS核心(上)
CSS 介绍 层叠样式表(英语:Cascading Style Sheets, 缩写:CSS; 又叫串样式列表,级联样式表,串接样式表,阶层式样式表)是一种用来为结构化文档(HTML或XML应用)添加样式(…...

深度学习常用损失函数介绍
均方差损失(Mean Square Error,MSE) 均方误差损失又称为二次损失、L2损失,常用于回归预测任务中。均方误差函数通过计算预测值和实际值之间距离(即误差)的平方来衡量模型优劣。即预测值和真实值越接近&…...

HarmonyOS-中级(四)
文章目录 Native适配开发三方库的基本使用 🏡作者主页:点击! 🤖HarmonyOS专栏:点击! ⏰️创作时间:2024年12月09日11点12分 Native适配开发 Node-API HarmonyOS Node-API 是 HarmonyOS 提供的…...

React v19稳定版发布12.5
🤖 作者简介:水煮白菜王 ,一位资深前端劝退师 👻 👀 文章专栏: 前端专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧✍。 感谢支持💕💕💕 目…...

【毕业设计选题】深度学习类毕业设计选题参考 开题指导
目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整…...

NanoLog起步笔记-4-Server端的两个线程
nonolog起步笔记-4-Server端的两个线程 Server端的两个线程两个线程的角色与各自的职责RuntimeLogger::compressionThreadMain线程 详细学习一下相关的代码第三个线程第一次出现原位置swip buffer Server端的两个线程 如前所述,nanolog的server端,相对而…...
linux zookeeper安装并服务化
1.版本信息 系统:centos7.6 java版本:java 8(已经安装好) zookeeper版本:3.6.3 2.zookeeper安装并测试 1.上传文件至指定目录并解压 切换至cd downloads 目录下, rz上传文件 解压:tar -zxvf apache-zookeeper-3.…...
很简单,但是很实用。把docker run改写成docker compose。
很简单,但是很实用。把docker run改写成docker compose。 在Docker的世界里,docker run命令是启动容器最直接的方式之一。然而,当项目复杂度增加,涉及多个服务时,管理这些容器和服务之间的依赖关系就会变得繁琐。这时,使用Docker Compose来定义和运行多容器Docker应用就…...

DAMODEL丹摩|丹摩平台:AI时代的开发者福音
本文仅对丹摩平台进行介绍,非广告。 文章目录 1. 丹摩平台简介2. 平台特性2. 1 超友好的用户体验2. 2 资源丰富的GPU覆盖2. 3 强大的性能2. 4 超实惠的价格2. 5 不同目的推荐的配置2. 6 启动环境 3. 快速上手丹摩平台3. 1 创建项目与资源实例3. 2 储存选项3. 3 数据…...

全面解析租赁小程序的功能与优势
内容概要 租赁小程序正在逐渐改变人与物之间的互动方式。通过这些小程序,用户不仅可以轻松找到所需的租赁商品,还能够享受无缝的操作体验。为了给大家一个清晰的了解,下面我们将重点介绍几个核心功能。 建议:在选择租赁小程序时&…...

VRRP的知识点总结及实验
1、VRRP VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)既能够实现网关的备份,又能解决多个网关之间互相冲突的问题,从而提高网络可靠性。 2、VRRP技术概述: 通过把几台路由设备联合组成一台虚拟的“路由设备”…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
生成对抗网络(GAN)损失函数解读
GAN损失函数的形式: 以下是对每个部分的解读: 1. , :这个部分表示生成器(Generator)G的目标是最小化损失函数。 :判别器(Discriminator)D的目标是最大化损失函数。 GAN的训…...