当前位置: 首页 > news >正文

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类步骤 注意&#xff1a;指定拦截路径&#xff0c;我们有两种方式 实例 前言 本篇博客的核心 知道过滤器的整个拦截过程知道如何指定拦截路径知道过滤器的生命周期…...

ModStartBlog v10.0.0 发布时间自定义,多图快速粘贴,博客编辑器升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装 …...

Unexpected token ‘<‘, “<!doctype “... is not valid JSON

Unexpected token ‘<’, "<!doctype "… is not valid JSON 在前端开发时&#xff0c;遇到以下报错内容。 1.报错内容如下&#xff1a; // 报错内容 Uncaught (in promise) SyntaxError: Unexpected token <, "<!doctype "... is not valid…...

24/12/9 算法笔记<强化学习> PPO,DPPO

PPO是目前非常流行的增强学习算法&#xff0c;OpenAI把PPO作为目前baseline算法&#xff0c;首选PPO&#xff0c;可想而知&#xff0c;PPO可能不是最强的&#xff0c;但是是最广泛的。 PPO是基于AC架构&#xff0c;因为AC架构有一个好处&#xff0c;就是解决了连续动作空间的问…...

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代码&#xff0c; …...

【数据库】关系代数和SQL语句

一 对于教学数据库的三个基本表 学生S(S#,SNAME,AGE,SEX) 学习SC(S#,C#,GRADE) 课程(C#,CNAME,TEACHER) &#xff08;1&#xff09;试用关系代数表达式和SQL语句表示&#xff1a;检索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 创建模拟器详细图文操作&#xff0c;包含了每一步的详细操作&#xff0c;便于理解和掌握对模拟的创建。 日期&#xff1a;2024年12月9日 作者&#xff1a;任聪聪 运行效果&#xff1a; 说明&#xff1a;创建运行后&#xff0c;点击右侧如下图…...

网络安全法-附则

第七章 附 则 第七十六条 本法下列用语的含义&#xff1a; &#xff08;一&#xff09;网络&#xff0c;是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息进行收集、存储、传输、交换、处理的系统。 &#xff08;二&#xff09;网络安全&#xff…...

CSS核心(上)

CSS 介绍 层叠样式表&#xff08;英语&#xff1a;Cascading Style Sheets, 缩写:CSS; 又叫串样式列表&#xff0c;级联样式表&#xff0c;串接样式表&#xff0c;阶层式样式表&#xff09;是一种用来为结构化文档&#xff08;HTML或XML应用&#xff09;添加样式&#xff08;…...

深度学习常用损失函数介绍

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

HarmonyOS-中级(四)

文章目录 Native适配开发三方库的基本使用 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月09日11点12分 Native适配开发 Node-API HarmonyOS Node-API 是 HarmonyOS 提供的…...

React v19稳定版发布12.5

&#x1f916; 作者简介&#xff1a;水煮白菜王 &#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧✍。 感谢支持&#x1f495;&#x1f495;&#x1f495; 目…...

【毕业设计选题】深度学习类毕业设计选题参考 开题指导

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

NanoLog起步笔记-4-Server端的两个线程

nonolog起步笔记-4-Server端的两个线程 Server端的两个线程两个线程的角色与各自的职责RuntimeLogger::compressionThreadMain线程 详细学习一下相关的代码第三个线程第一次出现原位置swip buffer Server端的两个线程 如前所述&#xff0c;nanolog的server端&#xff0c;相对而…...

linux zookeeper安装并服务化

1.版本信息 系统&#xff1a;centos7.6 java版本&#xff1a;java 8(已经安装好) zookeeper版本&#xff1a;3.6.3 2.zookeeper安装并测试 1.上传文件至指定目录并解压 切换至cd downloads 目录下&#xff0c; rz上传文件 解压&#xff1a;tar -zxvf apache-zookeeper-3.…...

很简单,但是很实用。把docker run改写成docker compose。

很简单,但是很实用。把docker run改写成docker compose。 在Docker的世界里,docker run命令是启动容器最直接的方式之一。然而,当项目复杂度增加,涉及多个服务时,管理这些容器和服务之间的依赖关系就会变得繁琐。这时,使用Docker Compose来定义和运行多容器Docker应用就…...

DAMODEL丹摩|丹摩平台:AI时代的开发者福音

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

全面解析租赁小程序的功能与优势

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

VRRP的知识点总结及实验

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

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...