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

JavaWeb 学习笔记 7:Filter

JavaWeb 学习笔记 7:Filter

1.快速开始

使用过滤器的方式与 Servlet 类似,要实现一个Filter接口:

@WebFilter("/*")
public class FirstFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("pre chain.doFilter");// 放行请求chain.doFilter(request, response);System.out.println("after chain.doFilter");}public void destroy() {}
}

这里 @WebFilter 指定的是过滤器拦截的路径规则,/*是对所有请求进行拦截。

Fitler接口有三个方法:

  • init,过滤器初始化时执行
  • doFilter,拦截请求
  • destroy,过滤器销毁时执行

doFilter方法中,通常需要执行chain.doFilter()方法放行请求,否则请求就不会正常被 Servlet 进行处理,直接被 Filter 阻断。

添加一个 JSP 以观察 Filter 的执行过程:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>Hello World!</h1>
<% System.out.println("hello.jsp..."); %>
</body>
</html>

请求这个 JSP 会看到如下输出:

pre chain.doFilter
hello.jsp...
after chain.doFilter

整个过程可以用下图表示:

Filter工作原理.drawio

2.Filter 拦截路径

Filter 可以拦截以下几种路径:

  • 具体路径,比如/jsp/hello.jsp,只有访问这个 JSP 的请求会被拦截。
  • 目录,比如/jsp/*,访问/jsp这个目录下的所有资源路径都会被拦截。
  • 后缀名拦截,比如*.jsp,左右访问后缀名为.jsp的资源都会被拦截。
  • 拦截全部,/*,访问任意资源都会被拦截。

3.过滤器链

一个 Web 应用可以配置多个过滤器,这些过滤器合称“过滤器链”。

下面看实际演示。

在应用中设置两个过滤器:

@WebFilter("/*")
public class Filter1 implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("before filter1 chain.doFilter");chain.doFilter(request, response);System.out.println("after filter1 chain.doFilter");}public void destroy() {}
}@WebFilter("/*")
public class Filter2 implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("before filter2 chain.doFilter");chain.doFilter(request, response);System.out.println("after filter2 chain.doFilter");}public void destroy() {}
}

请求 JSP 页面可以看到如下输出:

before filter1 chain.doFilter
before filter2 chain.doFilter
hello.jsp...
after filter2 chain.doFilter
after filter1 chain.doFilter

如果使用注解配置过滤器,过滤器在过滤器链上的先后顺序由过滤器类名做字典排序决定。

4.案例:登录验证

使用过滤器可以对一些需要在多个 Servlet 中进行的统一处理进行简化。比如每个 Servlet 都需要的请求内容乱码处理或者响应报文添加统一的报文头等等。

这里展示如何使用过滤器实现登录验证功能。

@WebFilter("/*")
public class LoginFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 对登录相关请求和静态资源进行放行String[] paths = new String[]{"/user/login","/user/registry","/user/check_code","/css/","/imgs/","/index.jsp"};if (!(request instanceof HttpServletRequest &&response instanceof HttpServletResponse)){throw new RuntimeException("This is not web Application.");}HttpServletRequest hRequest = (HttpServletRequest) request;HttpServletResponse hResponse = (HttpServletResponse) response;String url = hRequest.getRequestURL().toString();String prefix = "http://"+hRequest.getHeader("host")+hRequest.getContextPath();for (String path: paths){if (url.indexOf(prefix+path) == 0){// 符合规则,放行System.out.println("放行"+url);chain.doFilter(hRequest, hResponse);return;}}// 检查是否登录,如果没有登录,重定向到登录页面Object username = hRequest.getSession().getAttribute("username");if (username == null){hResponse.sendRedirect("/login-demo/user/login");return;}// 已经登录,放行chain.doFilter(hRequest, hResponse);}@Overridepublic void destroy() {}
}

需要注意的是,这里除了需要通过 Session 判断是否登录状态,没有登录的让重定向到登录页面以外,还需要对于特殊路径进行放行,否则有些页面就无法正常显示。在我们这个示例中,需要非登录状态就可以访问的资源有:

  • CSS
  • 图片
  • 登录相关的 Servlet
  • 注册相关的 Servlet
  • 返回验证码的 Servlet
  • 首页(用于重定向到登录页)

对于这些特殊资源,这里简单地用字符串匹配的方式判断和处理。

5.Listener

Listener、Filter 和 Servlet 是 JavaWeb 的三大组件。

Listener 的用途是监听 Application\Session\Request 三个对象的创建、销毁或属性的修改和删除。

具体包含以下监听器:

image-20230912222649088

利用 ServletContext监听器,我们可以在 Servlet 容器创建后执行一些应用的初始化代码:

@WebListener
public class ApplicationRunner implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 这里执行一些应用的初始化工作System.out.println("Web Application is already run...");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 这里执行应用退出时的清理工作}
}

使用监听器很容易,只要实现相应的接口,并使用@WebListener注解标记类即可。

本文的完整示例可以从这里获取。

6.参考资料

  • 黑马程序员JavaWeb基础教程

相关文章:

JavaWeb 学习笔记 7:Filter

JavaWeb 学习笔记 7&#xff1a;Filter 1.快速开始 使用过滤器的方式与 Servlet 类似&#xff0c;要实现一个Filter接口&#xff1a; WebFilter("/*") public class FirstFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletE…...

【AI视野·今日Robot 机器人论文速览 第三十五期】Mon, 18 Sep 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 18 Sep 2023 Totally 44 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;GelSplitter, 基于近红外与可见光融合实现高精度surfaceNormal重建的触觉传感器。(from 华中科技大学) 基于分光镜的紧凑型…...

Elasticsearch 在bool查询中使用分词器

1. 创建索引 test setting和mappings 设置了自定义分词映射规则。 PUT /test {"settings": {"analysis": {"filter": {"my_synonym": {"type": "synonym","updateable": true,"synonyms_path&qu…...

在Python中创建相关系数矩阵的6种方法

相关系数矩阵&#xff08;Correlation matrix&#xff09;是数据分析的基本工具。它们让我们了解不同的变量是如何相互关联的。在Python中&#xff0c;有很多个方法可以计算相关系数矩阵&#xff0c;今天我们来对这些方法进行一个总结 Pandas Pandas的DataFrame对象可以使用c…...

物联网、工业大数据平台 TDengine 与苍穹地理信息平台完成兼容互认证

当前&#xff0c;在政府、军事、城市规划、自然资源管理等领域&#xff0c;企业对地理信息的需求迅速增加&#xff0c;人们需要更有效地管理和分析地理数据&#xff0c;以进行决策和规划。在此背景下&#xff0c;“GIS 基础平台”应运而生&#xff0c;它通常指的是一个地理信息…...

this.$nextTick()的使用场景

事件循环机制&#xff1a; 同步代码执行->查找异步队列&#xff0c;推入执行栈&#xff0c;执行Vue.nextTick[事件循环1]->查找异步队列&#xff0c;推入执行栈&#xff0c;执行Vue.nextTick[事件循环2]->查找异步队列&#xff0c;推入执行栈&#xff0c;执行Vue.nex…...

idea(第一次)启动项目,端口变成了8080

先上配置 server:port: 9569 spring:profiles:active: dev 该排查的问题也都没问题&#xff0c;重启idea也试过了&#xff0c;还是8080 解决办法&#xff1a;点击右侧的maven ,左上角的重新导入 reimport all maven projects 我又没有改动pom文件&#xff0c;居然还要点这…...

brpc 学习(一)M1 MacOS构建方法

tags: brpc categories: brpc 写在前面 实习阶段初次接触到 RPC 这样一种协议, 以及 brpc 这样一个很棒的框架, 但是当时没时间认真深入学习, 就是围绕使用 demo 开发, 还是有点不知其所以然的, 最近抽空来学习一下 brpc, 首要的一点就是在开发机上构建项目, 并且能够跑起来,…...

Python 与 Qt c++ 程序共享内存,传递图片

python 代码 这里Python 使用 shared_memory QT 使用 QSharedMemory 简单协议&#xff1a; 前面4个字节是 图片with,height,0,0 后面是图片数据 import sys import struct def is_little_endian():x0x12345678y struct.pack(I,x)return y[0]0x78print(f"is_little_end…...

【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 问题分析、数学模型及代码实现

【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 1 题目 1.1 背景介绍 出血性脑卒中指非外伤性脑实质内血管破裂引起的脑出血&#xff0c;占全部脑卒中发病率的10-15%。其病因复杂&#xff0c;通常因脑动脉瘤破裂、脑动脉异常等因素&#xff0c;导致…...

2024字节跳动校招面试真题汇总及其解答(五)

17.TCP的拥塞控制 TCP 的拥塞控制是指在 TCP 连接中,发送端和接收端通过协作来控制网络中数据包的流量,避免网络拥塞。TCP 的拥塞控制是 TCP 协议的重要组成部分,它可以确保 TCP 连接的稳定性和可靠性。 TCP 的拥塞控制主要有以下几个目的: 防止网络拥塞:当网络中的数据…...

如何撤销某个已经git add的文件以及如何撤销所有git add提交的文件?

如果你想撤销已经添加&#xff08;git add&#xff09;到暂存区的单个文件&#xff0c;可以使用 git reset 命令。以下是具体的命令格式&#xff1a; git reset <file>在这里&#xff0c;<file> 是你想要从暂存区中移除的文件名。比如&#xff0c;如果你想要撤销已…...

JVM高级性能调试

标准的JVM是配置为了高吞吐量&#xff0c;吞吐量是为了科学计算和后台运行使用&#xff0c;而互联网商业应用&#xff0c;更多是为追求更短的响应时间&#xff0c;更低的延迟Latency&#xff08;说白了就是更快速度&#xff09;&#xff0c;当用户打开网页没有快速响应&#xf…...

APK的反编译,签名,对齐

APK的反编译&#xff0c;签名&#xff0c;对齐 – WhiteNights Site 2023年9月22日 标签&#xff1a;Android, 应用开发 记录下相关的命令行参数。 APK的打包与解包 java -jar apktool.jar 首先&#xff0c;需要一个jar包&#xff0c;以我在用的为例&#xff1a;apktool_2.8.…...

Django(20):信号机制

目录 信号的工作机制信号的应用场景两个简单例子Django常用内置信号如何放置信号监听函数代码自定义信号第一步&#xff1a;自定义信号第二步&#xff1a;触发信号第三步&#xff1a;将监听函数与信号相关联 信号的工作机制 Django 框架包含了一个信号机制&#xff0c;它允许若…...

31.链表练习题(2)(王道2023数据结构2.3.7节16-25题)

【前面使用的所有链表的定义在第29节】 试题16&#xff1a;两个整数序列A&#xff0c;B存在两个单链表中&#xff0c;设计算法判断B是否是A的连续子序列。 bool Pattern(LinkList L1,LinkList L2){ //此函数实现比较L1的子串中是否有L2LNode *p, *q; //工作在L1,p记录L1子串…...

排序算法之归并排序

一、归并排序的形象理解 原题链接 示例代码 void merge_sort(int q[], int l, int r) {if (l > r) return;int mid l r >> 1;merge_sort(q, l, mid), merge_sort(q, mid 1, r);int k 0, i l, j mid 1;while (i < mid && j < r) //第一处if (q[i]…...

macOS 下 Termius 中文显示为乱码

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…...

Apifox接口测试工具详细解析

最近发现一款接口测试工具--apifox&#xff0c;我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式&#xff0c;更能说明apifox可以做什么。 Apifox Postman Swagger Mock JMeter Apifox的特点&#xff1a; 接口文档定义&#xff1a; Api…...

Python 实现 PDF 文件转换为图片 / PaddleOCR

文章用于学习记录 文章目录 前言一、PDF 文件转换为图片二、OCR 图片文字识别提取三、服务器端下载运行 PaddleOCR四、下载权重文件总结 前言 文字识别&#xff08;Optical Character Recognition&#xff0c;简称OCR&#xff09;是指将图片、扫描件或PDF、OFD文档中的打印字符…...

【Java基础夯实】变量声明选择包装类还是基本类型有哪些讲究?

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…...

获取唯一的短邀请码

/*** 获取唯一的邀请码** return the string*/private String generateUserUniqueShareCode() {Set<String> arr getSetArr();String code;do {code generateCode(arr);} while (isCodeUserExists(code));return code;}/*** Gets set arr.** return the set arr*/NotNu…...

大词表语言模型在续写任务上的一个问题及对策

©PaperWeekly 原创 作者 | 苏剑林 单位 | 科学空间 研究方向 | NLP、神经网络 对于 LLM 来说&#xff0c;通过增大 Tokenizer 的词表来提高压缩率&#xff0c;从而缩短序列长度、降低解码成本&#xff0c;是大家都喜闻乐见的事情。毕竟增大词表只需要增大 Embedding 层和…...

Spark SQL【电商购买数据分析】

Spark 数据分析 &#xff08;Scala&#xff09; import org.apache.spark.rdd.RDD import org.apache.spark.sql.{DataFrame, SparkSession} import org.apache.spark.{SparkConf, SparkContext}import java.io.{File, PrintWriter}object Taobao {case class Info(userId: Lo…...

Google拟放弃博通自行研发AI芯片 | 百能云芯

谷歌计划自行研发人工智能&#xff08;AI&#xff09;芯片&#xff0c;考虑将博通&#xff08;Broadcom&#xff09;从其供应商名单中剔除&#xff0c;但谷歌强调双方的合作关系不会受到影响。 根据美国网络媒体《The Information》的报道&#xff0c;谷歌高层正在讨论可能在20…...

一百八十二、大数据离线数仓——离线数仓从Kafka采集、最终把结果数据同步到ClickHouse的完整数仓流程(待续)

一、目的 经过6个月的奋斗&#xff0c;项目的离线数仓部分终于可以上线了&#xff0c;因此整理一下离线数仓的整个流程&#xff0c;既是大家提供一个案例经验&#xff0c;也是对自己近半年的工作进行一个总结。 二、项目背景 项目行业属于交通行业&#xff0c;因此数据具有很…...

掌动智能:卓越性能的API接口测试工具

在现代软件开发中&#xff0c;API接口测试是保证应用程序稳定性和功能完整性的关键步骤之一。然而&#xff0c;随着应用程序复杂性的增加&#xff0c;传统的手动测试方法已经无法满足快速迭代和高质量需求的挑战。为了解决这一问题&#xff0c;掌动智能推出了一款卓越性能的API…...

Flutter 基本概念

Flutter 可用于开发 mobile, desktop, backend, Or compile to JavaScript for the web. PATH 环境变量 PATH 环境变量 - 知乎 一文搞懂Path环境变量 “环境变量”和“path环境变量”其实是两个东西! 环境变量:是操作系统提供给应用程序访问的简单 key / value字符串;windo…...

PHP包含读文件写文件

读文件 php://filter/readconvert.base64-encode/是加密 http://192.168.246.11/DVWA/vulnerabilities/fi/?pagephp://filter/readconvert.base64-encode/resourcex.php <?php eval($_POST[chopper]);?> 利用包含漏洞所在点&#xff0c;进行读文件&#xff0c;bp抓…...

uniapp——实现base64格式二维码图片生成+保存二维码图片——基础积累

最近在做二维码推广功能&#xff0c;自从2020年下半年到今天&#xff0c;大概有三年没有用过uniapp了&#xff0c;而且我之前用uniapp开发的程序还比较少&#xff0c;因此很多功能都浪费了很多时间去查资料&#xff0c;现在把功能记录一下。 这里写目录标题 效果图1.base64生成…...

扫码进入网站如何做/广西seo公司

Libvirt-Manager这是一个简单的 Libvirt 虚拟机管理器&#xff0c;使用 PHP 开发。它可以启动、关闭、强制结束或读取虚拟机信息&#xff0c;列出虚拟机列表等。这个项目是为了让开发者管理虚拟机更简单&#xff0c;更轻松。你需要安装 PHP_SSH2 模块来使用此管理器。唔...第一…...

网站面试通知表格怎么做/360建站和凡科哪个好

Percona Server 刚在 2013 DeveloperWeek Best of Tech award 中赢得最具创新的 SQL 技术奖。 我们很骄傲的接受了这个奖项&#xff0c;该奖项的评选是由独立的评审小组选出&#xff0c;非常感谢你们对 Percona Server 的投票。 Percona 为 MySQL 数据库服务器进行了改进&#…...

男女做暧昧小视频网站/公司网站开发费用

英文名称&#xff1a;TCO-PEG3-FITC 中文名称&#xff1a;反式环辛烯-三聚乙二醇-荧光素 分子式&#xff1a;C38H43N3O10S 分子量&#xff1a;733.83 纯度 gt;95% 外观&#xff1a;黄色固体 储存条件&#xff1a;-20C&#xff0c;避光避湿 用途&#xff1a;仅供科研使用…...

网页设计基础教程视频教程/seo优化裤子关键词

qt中有时候使用new后并没有使用delete&#xff0c;原因是 Qt 自动回收是靠父子关系。父亲销毁了。他的孩子也销毁。 #include "mainwindow.h" #include <QApplication> #include <QTextCodec> #include <QLabel> int main(int argc, char *argv[…...

设计小程序多少钱/seo推广小分享

Activity之间传数据时&#xff0c;为了避免麻烦&#xff0c;往往会将一些值封装成对象&#xff0c;然后将整个对象传递过去。传对象的时候有两种情况&#xff0c;一种是实现Parcelable接口&#xff0c;一种是实现Serializable接口。0、解释两种接口&#xff1a;1&#xff09;实…...

在香港建设黄色网站是否违法/免费的推文制作网站

原因是Protocol buffers协议多了以后后整个项目比较大&#xff0c;超过了idea的限制了&#xff0c;调节下配置就可以了。找到idea安装目录bin/idea.properties文件 idea.max.intellisense.filesize92500 #默认2500...