Filter(过滤器)

文章目录

  • 过滤器的编写:
  • 过滤器 API
    • Filter
    • FilterConfig
    • FilterChain
  • 生命周期
  • 过滤器核心方法的细节
  • 多个过滤器执行顺序
  • <br />


在这里插入图片描述

过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener。
它是在2000年发布的Servlet2.3规范中加入的一个接口。是Servlet规范中非常实用的技术。
它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作。
常见应用场景:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。

过滤器的编写:

@WebFilter(filterName = "FilterDemo2",urlPatterns = "/*")
public class FilterDemo1 implements Filter {/*** 过滤器的核心方法* @param request* @param response* @param chain* @throws IOException* @throws ServletException*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {/*** 如果不写此段代码,控制台会输出两次:FilterDemo1拦截到了请求。*/HttpServletRequest req = (HttpServletRequest) request;String requestURI = req.getRequestURI();if (requestURI.contains("favicon.ico")) {return;}System.out.println("FilterDemo1拦截到了请求");}
}

过滤器 API

Filter

返回类型 方法 简介

void init(FilterConfig conf) 用于执行过滤器的初始化工作,web容器会在web项目启动时自动调用该方法。
void doFilter(ServletRequest request,SerlvetResponse response,FilterChain chain) 当请求和响应被过滤器拦截后,都会交给doFilter来处理:其中两个参数分别是被拦截request和response对象,可以使用chain的doFliter方法来放行。
void destroy() 用于释放关闭Filter对象打开的资源,在web项目关闭时,由web容器自动调用该方法。

Filter_API.png
Filter_API2.png

FilterConfig

FilterConfig_API.png

FilterChain

FilterChain_API.png

生命周期

出生当应用加载的时候执行实例化和初始化方法。

活着只要应用一直提供服务,对象就一直存在。

死亡当应用卸载时,或者服务器宕机时,对象消亡。

Filter的实例对象在内存中也只有一份。所以也是单例的。

过滤器核心方法的细节

/*** 过滤器的核心方法*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {/*** 如果不写此段代码,控制台会输出两次:FilterDemo1拦截到了请求。HttpServletRequest req = (HttpServletRequest) request;String requestURI = req.getRequestURI();if (requestURI.contains("favicon.ico")) {return;}*/System.out.println("FilterDemo1拦截到了请求");//过滤器放行chain.doFilter(request, response);System.out.println("FilterDemo1放行之后,又回到了doFilter方法");
}

测试运行结果,我们发现过滤器放行之后执行完目标资源,仍会回到过滤器中:
filter_demo8.png

多个过滤器执行顺序

运行结果
filter_multi_demo.png




在这里插入图片描述



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

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

相关文章

Go语言基础基础

简介 Go语言&#xff08;也称为Golang&#xff09;是一种静态类型、编译型语言&#xff0c;由Google的Robert Griesemer、Rob Pike和Ken Thompson于2007年设计&#xff0c;首次公开发布于2009年。Go的设计初衷是解决当时谷歌内部面临的软件开发问题&#xff0c;特别是在处理大…

百度文库旋转验证码识别

最近研究了一下图像识别&#xff0c;一直找到很好的应用场景&#xff0c;今天我就发现可以用百度的旋转验证码来做一个实验。没想到效果还挺好&#xff0c;下面就是实际的识别效果。 1、效果演示 2、如何识别 2.1准备数据集 首先需要使用爬虫&#xff0c;对验证码图片进行采…

区块链媒体发布推广10个热门案例解析-华媒舍

区块链技术的发展已经引起了媒体的广泛关注&#xff0c;越来越多的区块链媒体纷纷发布推广相关的热门案例。本文将介绍10个成功的区块链媒体推广案例&#xff0c;并分享它们的成功秘诀&#xff0c;帮助读者更好地了解区块链媒体推广的方法与技巧。 随着区块链技术的成熟和应用场…

第二证券:富时罗素扩容 A股引入国际增量资金

日前&#xff0c;英国富时罗素指数公司&#xff08;FTSE Russell&#xff0c;简称“富时罗素”&#xff09;公布的全球股票指数&#xff08;FTSE Global Equity Index Series&#xff09;半年度指数检查陈述显现&#xff0c;将新调入A股76只、调出1只。此前&#xff0c;富时罗素…

Leetcode 3049. Earliest Second to Mark Indices II

Leetcode 3049. Earliest Second to Mark Indices II 1. 解题思路2. 代码实现3. 算法优化 题目链接&#xff1a;3049. Earliest Second to Mark Indices II 1. 解题思路 这道题我看貌似难度报表&#xff0c;比赛的时候貌似只有36个人搞定了这道题目&#xff0c;然后最快的人…

【LeetCode】升级打怪之路 Day 12:单调队列

今日题目&#xff1a; 239. 滑动窗口最大值 | LeetCode 今天学习了单调队列这种特殊的数据结构&#xff0c;思路很新颖&#xff0c;值得学习。 Problem&#xff1a;单调队列 【必会】 与单调栈类似&#xff0c;单调队列也是一种特殊的数据结构&#xff0c;它相比与普通的 que…

Get Your Back Covered! Coverage, CodeCov和Tox

1. Coverage - 衡量测试的覆盖率 我们已经掌握了如何进行单元测试。接下来,一个很自然的问题浮现出来,我们如何知道单元测试的质量呢?这就提出了测试覆盖率的概念。覆盖率测量通常用于衡量测试的有效性。它可以显示您的代码的哪些部分已被测试过,哪些没有。 coverage.py …

Arm平台下各种memcpy优化对比<二>

因memcpy导致tda4vm上的h264解码占CPU较高而改弃&#xff0c;从网上找到各种memcpy的优化代码&#xff0c;在一起做了个运行速度对比&#xff0c;请查收&#xff1b; #include <stdio.h> #include <stdlib.h> /* rand, srand */ #include <string.h> #i…

智慧公厕:打造智慧城市的环卫明珠

在城市建设中&#xff0c;公共卫生设施的完善和智能化一直是重要环节。而智慧公厕作为智慧城市建设的重要组成部分&#xff0c;发挥着不可替代的作用。本文以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案例现场实景实图&#xff0c;解读智慧公厕如何助力打…

【数据结构】B树

1 B树介绍 B树&#xff08;英语&#xff1a;B-tree&#xff09;&#xff0c;是一种在计算机科学自平衡的树&#xff0c;能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作&#xff0c;都在对数时间内完成。B树&#xff0c;概括来说是一个一般化的…

MySQL高可用性攻略:快速搭建MySQL主从复制集群 !

MySQL高可用性攻略&#xff1a;快速搭建MySQL主从复制集群 &#xff01; MySQL基础知识&#xff1a;介绍MySQL数据库的基本概念和常用命令&#xff0c;如何创建数据库、表、用户和权限管理等。 MySQL安装教程&#xff1a;Centos7 安装MySQL5.7.29详细安装手册 MySQL数据类型&…

【大厂AI课学习笔记NO.63】模型的维护

说是模型的维护&#xff0c;其实这堂课都是在讲“在工业环境中开发和部署机器学习模型的流程”。 上图来自于我的笔记思维脑图&#xff0c;已经上传&#xff0c;要链接的访问的主页查看资源。 一路走来&#xff0c;我们学习了数据管理、模型学习、模型验证、模型部署等重要的步…

arm板运行程序时寻找动态库的路径设置

问题&#xff1a;error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file&#xff1f; 第一种方法---- 解决&#xff1a; ①复制需要用到的arm库到板子上。 ②pwd指令获取该库的绝对路径&#xff0c;把路径复制到/etc/ld.so.conf文件 ③输…

Leetcoder Day37| 动态规划part04 背包问题

01背包理论基础 面试掌握01背包&#xff0c;完全背包和重背包就够用了。 背包问题的理论基础重中之重是01背包&#xff0c;一定要理解透&#xff01; 01 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品…

隐式马尔科夫算法

隐式马尔科夫算法 隐式马尔科夫算法概述算法使用HMM 模型参数设置HMM 模型分类1. Gaussian HMM2. Multinomial HMM3. GMM HMM 其他机器学习算法&#xff1a;机器学习实战工具安装和使用 隐式马尔科夫算法概述 隐式马尔科夫算法是一种用于处理时序数据的强大工具&#xff0c;其…

css通过calc动态计算宽度

max-width: calc(100% - 40px) .m-mj-status-drawing-info-data{ display: inline-block; margin: 10px; min-width: 200px; padding: 10px;border-radius: 10px; background: #ddd;max-width: calc(100% - 40px);word-wrap: break-word;white-space: pre-line;}我开发的chatg…

计算机二级(Python)真题讲解每日一题:《字典字符查找》

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬ 在右侧的答题模板中&#xf…

Crash 实例

1.spinlock原理 为了解决这个spinlock的不公平问题&#xff0c;linux 2.6.25内核以后&#xff0c;spinlock采用了一种"FIFO ticket-based"算法的spinlock机制&#xff0c;可以很好的实现先来先抢占的思想。具体的做法如下&#xff1a; (1)、spinlock的核心字段有ow…

C语言-柔性数组成员的使用

文章目录 摘要柔性数组成员基本使用细节探究 零长度数组-定长数组-变长数组 摘要 本文先介绍柔性数组成员(flexible array member)的基本使用&#xff0c;然后介绍其内存结构。最后&#xff0c;补充了一些数组相关的其他概念。 柔性数组成员 基本使用 参考: 【C语言内功修炼…

[项目设计] 从零实现的高并发内存池(一)

&#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[高并发内存池] ❤️ 前置学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 ​ 目录 前言 项目介绍 1.内存池 1.1 什么是内存池 池化技术 内存池 1.2 为什…