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

JavaWeb-Filter过滤器

目录

Filter过滤器

1. Filter的生命周期

2.Filter的配置

3.拦截路径

4.拦截具体的使用

 5.拦截方式配置(资源被访问方式)

6.FilterChain拦截链


Filter过滤器

      filter是过滤器,相比于Servlet的发送请求,filter是用于拦截请求。比如在登陆系统中,正常登陆的用户可以访问服务器的相关资源,而如果登陆信息错误,则拦截想要访问资源的请求。以下将具体介绍filter

1. Filter的生命周期

Filter的生命周期分为三部分,分别是init()初始化;doFilter()执行拦截;destroy()销毁;

具体如下代码

package com.company.Filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//注解配置实现所有请求访问都进行拦截
@WebFilter("/*")
public class filterDemo1 implements Filter {
//    初始化@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("加载的时候自动执行,并且只执行一次");}
//    执行拦截@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("实现拦截的时候执行函数,可以多次执行");}
//    销毁@Overridepublic void destroy() {System.out.println("在服务器关闭的时候,执行销毁函数");}
}

2.Filter的配置

Filter的配置分为两种,一种是xml配置,一种是通过注解类配置

  • 通过xml配置(打开web.xml):
    <filter>
<!--        随便创建想要的名称--><filter-name>filterDemo1</filter-name>
<!--        filter对应的具体类--><filter-class>com.company.Filter.filterDemo1</filter-class></filter>
<!--    创建filter对应的映射--><filter-mapping>
<!--        filter对应的名称--><filter-name>filterDemo1</filter-name>
<!--        拦截路径,/*表示所有访问都会进行拦截--><url-pattern>/*</url-pattern></filter-mapping>
  • 通过注解类进行配置:

@WebFilter(value=url-pattern)

如果只需要写拦截规路径可以省略掉value = ;

直接输入@WebFilter("/*")实现对数据所有访问时候进行拦截


3.拦截路径

刚才介绍了/*是所有请求的拦截,但是对于具体访问的请求的拦截还无法做到,下面介绍其他拦截路径

  1. 具体路径访问的拦截:/index.jsp (当访问index.jsp文件时候实现拦截)
  2. 某一个目录的访问的拦截:/user (当访问user目录以下的所有文件时候进行拦截)
  3. 后缀名访问的拦截:*.jsp (实现对所有文件以.jsp后缀结尾访问的拦截)
  4. 拦截所有相关路径:/*     (访问所有服务器的资源时候都实现拦截)

4.拦截具体的使用

1.创建类实现Filter接口(注意Filter接口是包javax.servlet中的)

2.覆写生命周期函数

3.通过doFilter函数实现拦截。当通过后实现放行

案例代码:

拦截类

package com.company.Filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;//通过注解类实现拦截路径
@WebFilter("/*")
//实现接口
public class filterDemo2 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器已被加载");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("发现请求,实施拦截");进行验证,如果通过则实现放行
//        System.out.println("验证成功,放行");
//        filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {System.out.println("服务器关闭时候执行销毁函数");}
}

模拟资源类

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/FilterDemo3")
public class FilterDemo3 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("访问到资源啦");}
//    方法统一@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}
}

当通过url访问资源类时候 可以看到请求被拦截了,无法执行资源类中输出"访问资源类啦"

再加上验证功能后如果允许通过则需要放行,执行FilterChain filterChain中filterChain对象的doFilter(servletRequest对象, servletResponse对象)即代码中的

//        拦截结束后如果通过则实现放行System.out.println("验证成功,放行");filterChain.doFilter(servletRequest, servletResponse);

 此时再通过url访问后,查看控制台的信息可以看到:


 5.拦截方式配置(资源被访问方式)

当然除了路径访问可以拦截以外,还可以设置拦截的方式,有些请求可以直接输入url直接访问类。有些通过一些网页实现跳转的方式获取类的资源。还有就是通过请求转发的形式获取类。所以基于如此可以对这些方法做一些限制。

拦截方法描述
REQUEST(请求拦截)拦截直接通过 URL 访问的请求。
FOWARD(转发拦截)拦截通过请求转发方式获取资源的请求。
INCLUDE(包含拦截)拦截通过网页跳转方式获取资源的请求。
ERROR(错误拦截)拦截发生错误或异常情况的请求。
ASYNC(异步拦截)拦截异步请求,即延迟加载的请求,可以防止对响应进行预先缓存和使用。

默认情况下是通过REQUEST实现拦截

具体使用还需要看开始时候使用的配置

  • 通过xml配置
   <filter><filter-name>filterDemo1</filter-name><filter-class>com.company.Filter.filterDemo1</filter-class></filter><filter-mapping><filter-name>filterDemo1</filter-name><url-pattern>/*</url-pattern>
<!--        配置请求拦截方法--><dispatcher>REQUEST</dispatcher></filter-mapping>
  • 通过注解类配置


6.FilterChain拦截链

拦截链,顾名思义就是由多个过滤器组成,就像是一条路设置了多个收费站一样。只有满足所有的拦截规则后才能通过。

设置多个拦截器(其中一个的代码)

package com.company.Filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*")
public class filterDemo3 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("拦截器1进行拦截");System.out.println("拦截器1放行");
//        拦截器放行filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}
}

通过url访问时候结果如下

 拦截器的顺序

一.注解配置

是通过拦截器名字的排序比如01、02、03,先比较第一个数字大小,如果相同就比较第二个数字大小以此类推

二.xml配置

只需要配置xml时候由上往下即可


 

相关文章:

JavaWeb-Filter过滤器

目录 Filter过滤器 1. Filter的生命周期 2.Filter的配置 3.拦截路径 4.拦截具体的使用 5.拦截方式配置&#xff08;资源被访问方式&#xff09; 6.FilterChain拦截链 Filter过滤器 filter是过滤器&#xff0c;相比于Servlet的发送请求&#xff0c;filter是用于拦截请求。…...

python如何实现1ms内触发两个接口请求

在Python中&#xff0c;可以通过多线程或者协程来实现1ms内触发两个接口请求。以下是两种方法的示例代码&#xff1a; 1.多线程实现&#xff1a; import threading import requestsdef send_request(url):response requests.get(url)print(response.text)# 创建两个线程&…...

深入解析路由与网络:网络的脉络

目录 路由 广域网 公网 外网 局域网 内网 以太网 Wi-Fi CDN IPv4和IPv6 IP地址分类 无类别域间路由&#xff08;CIDR&#xff09; 路由 路由是指在计算机网络中&#xff0c;将数据包从源地址传递到目标地址的过程。在一个复杂的网络中&#xff0c;数据包需要经过多…...

spring.HttpMessageNotReadableException: JSON parse error

实体类如下&#xff1a; Value public class Search{//搜索内容String value;//是否模糊搜索boolean fuzzy true; //其实这样写并不是“默认”模糊搜索&#xff0c;而是“一定是”模糊搜索 }spring.HttpMessageNotReadableException: JSON parse error: Cannot construct ins…...

安全中间件的设计思路和简单实践

rasp 的侵入式特性和拦截特性导致开发和运维普通不太愿意配合&#xff0c;当生产环境出现问题时往往第一时间先把责任推给 rasp&#xff0c;逐渐的安全部门普遍只能把 rasp 设置为告警模式&#xff0c;而且越是大的集群拦截开的就越少&#xff0c;所以字节的 elkeid 和某外卖大…...

试卷扫描成电子版方法分享,这个方法不要错过

很多时候&#xff0c;为了方便传输我们需要将试卷扫描成电子版进行存档&#xff0c;以备不时之需。很多小伙伴如果遇到试卷需要扫描转成电子版可能就不知道该如何操作了&#xff0c;其实试卷扫描是一项非常重要的工作&#xff0c;因此需要注意一些方法和细节。以下是试卷扫描成…...

【PostgreSQL的CLOG解析】

同样还是这张图&#xff0c;之前发过shared_buffer和os cache、wal buffer和work mem的文章&#xff0c;今天的主题是图中的clog&#xff0c;即 commit log&#xff0c;PostgreSQL10之前放在数据库目录的pg_clog下面。PostgreSQL10之后修更名为xact,数据目录变更为pg_xact下面&…...

腾讯云国际站代充-阿里云ECS怎么一键迁移到腾讯云cvm?

今天主要来介绍一下如何通过阿里云国际ECS控制台一键迁移至腾讯云国际CVM。腾讯云国际站云服务器CVM提供全面广泛的服务内容。无-需-绑-定PayPal&#xff0c;代-充-值腾讯云国际站、阿里云国际站、AWS亚马逊云、GCP谷歌云&#xff0c;官方授权经销商&#xff01;靠谱&#xff0…...

东方晶源亮相第十一届半导体设备年会,共话发展“芯”机遇

8月11日&#xff0c;以“协力同芯抢机遇&#xff0c;集成创新造设备”为主题的第十一届&#xff08;2023年&#xff09;中国电子专用设备工业协会半导体设备年会暨产业链合作论坛&#xff08;CSEAC&#xff09;在无锡太湖国际博览中心圆满闭幕。为期3天的CSEAC&#xff0c;通过…...

git修改历史commit信息

修改历史提交 commit 的信息 操作步骤&#xff1a; git rebase -i 列出 commit 列表找到需要修改的 commit 记录&#xff0c;把 pick 修改为 edit 或 e&#xff0c;:wq 保存退出修改 commit 的具体信息git commit --amend&#xff0c;保存并继续下一条git 4. 4. rebase --cont…...

基于K8S环境部署Dolphinscheduler及简单应用

一、Dolphinscheduler简介 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系,并为应用…...

Linux的ln命令

ln是link的缩写,在Linux中 ln 命令的功能是为某一个文件在另外一个位置建立一个同步的链接&#xff0c;当我们需要在不同的目录&#xff0c;用到相同的文件时&#xff0c;我们不需要在每一个需要的目录下都放一个必须相同的文件&#xff0c;我们只要在某个固定的目录&#xff0…...

深入了解Bear Necessities Hackathon黑客松的优胜者们

生态系统中的资深建设者皆知道Moonbeam是大型黑客松狂热爱好者&#xff0c;不论是线上虚拟的还是现场的。然而&#xff0c;很少有黑客松能达到Moonbeam和AWS举办的Bear Necessities黑客松这样的规模和吸引力。本次黑客松共有755人参与&#xff0c;共提交了62份参赛作品。其中22…...

mysql-tokudb使用qa

一、使用前提 安装tokudb引擎的前提条件是物理机要关闭大页&#xff0c;并需要注意物理机所剩内存和配置文件中tokudb_cache_size&#xff08;内存主要占用部分&#xff09;&#xff0c;innodb_buffer_pool_size的使用&#xff0c;另外tokudb的安装一定要安装libjemalloc依赖&…...

对比学习论文综述总结

第一阶段:百花齐放(18-19中) 有InstDisc(Instance Discrimination)、CPC、CMC代表工作。在这个阶段方法模型都还没有统一,目标函数也没有统一,代理任务也没有统一,所以说是一个百花齐放的时代 1 判别式代理任务---个体判别任务 1.1 Inst Dict---一个编码器+一个memory…...

【BASH】回顾与知识点梳理(二十三)

【BASH】回顾与知识点梳理 二十三 二十三. Linux 账号管理&#xff08;二&#xff09;23.1 账号管理新增与移除使用者&#xff1a; useradd, 相关配置文件, passwd, usermod, userdelusermoduserdel 23.2 用户功能&#xff08;普通用户可使用&#xff09;idfingerchfnchsh 23.3…...

用 Python 写一个 NoSQL 数据库

NoSQL 这个词在近些年正变得随处可见. 但是到底 “NoSQL” 指的是什么? 它是如何并且为什么这么有用? 在本文, 我们将会通过纯 Python (我比较喜欢叫它, “轻结构化的伪代码”) 写一个 NoSQL 数据库来回答这些问题. OldSQL 很多情况下, SQL 已经成为 “数据库” (database)…...

Spring Security自定义登陆界面和密码验证逻辑

maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency> 创建配置文件处理跳转拦截等功能以及密码比对功能 package com.example.demo2.demos.web1;…...

Android布局【LinearLayout】

文章目录 常见属性orientation的选择项解释项目结构主要代码 常见属性 orientation&#xff1a;布局中组件的排列方式gravity&#xff1a;控制组件所包含的子元素的对齐方式&#xff0c;可多个组合layout_gravity&#xff1a;控制该组件在父容器里的对齐方式background&#x…...

搭建grafana+loki+promtail日志收集系统

准备工作 下载地址 https://github.com/grafana/loki/releases 安装包放在服务器目录&#xff1a;/opt wget https://github.com/grafana/loki/releases/download/v2.4.2/loki-linux-amd64.zip wget https://github.com/grafana/loki/releases/download/v2.4.2/promtail-lin…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...