当前位置: 首页 > 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文档中的打印字符…...

网易云音乐无损解析:5大核心技术构建个人高品质音乐库

网易云音乐无损解析&#xff1a;5大核心技术构建个人高品质音乐库 【免费下载链接】Netease_url 网易云无损解析 项目地址: https://gitcode.com/gh_mirrors/ne/Netease_url 在数字音乐时代&#xff0c;如何突破平台限制&#xff0c;建立个人专属的高品质音乐库&#xf…...

如何快速掌握Sionna:下一代无线通信仿真的终极指南

如何快速掌握Sionna&#xff1a;下一代无线通信仿真的终极指南 【免费下载链接】sionna Sionna: An Open-Source Library for Next-Generation Physical Layer Research 项目地址: https://gitcode.com/gh_mirrors/si/sionna Sionna是一个基于TensorFlow的开源Python库&…...

QMK Toolbox终极指南:轻松掌握机械键盘固件部署与定制

QMK Toolbox终极指南&#xff1a;轻松掌握机械键盘固件部署与定制 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox QMK Toolbox是一款功能强大的开源键盘固件部署工具&#xff0c;专为QMK…...

Sora.FM零基础部署指南:3步上手AI视频生成工具的Linux实践方案

Sora.FM零基础部署指南&#xff1a;3步上手AI视频生成工具的Linux实践方案 【免费下载链接】sorafm 项目地址: https://gitcode.com/GitHub_Trending/so/sorafm Sora.FM是一款基于Sora AI技术的开源视频生成平台&#xff0c;支持通过文本描述创建高质量AI视频。本指南专…...

Gurobi Python接口避坑指南:从安装、建模到求解电影排片问题的实战记录

Gurobi Python实战避坑手册&#xff1a;电影排片优化全流程解析 第一次接触Gurobi时&#xff0c;我被它号称的"商业求解器性能标杆"吸引&#xff0c;却在安装环节就被Anaconda环境冲突绊住了脚步。作为从开源求解器转战商业工具的用户&#xff0c;我完整记录了从零开…...

LFM2.5-1.2B-Thinking-GGUF案例分享:为国产操作系统社区生成的发行版更新日志摘要

LFM2.5-1.2B-Thinking-GGUF案例分享&#xff1a;为国产操作系统社区生成的发行版更新日志摘要 1. 模型简介 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型&#xff0c;专为低资源环境优化设计。该模型采用GGUF格式存储&#xff0c;配合llama.cpp运行时&…...

4步掌握AI图像修复新工具:IOPaint从入门到精通指南

4步掌握AI图像修复新工具&#xff1a;IOPaint从入门到精通指南 【免费下载链接】IOPaint 项目地址: https://gitcode.com/GitHub_Trending/io/IOPaint AI图像修复技术正在改变我们处理数字图像的方式&#xff0c;从简单的水印去除到复杂的老照片修复&#xff0c;都可以…...

Monocle2拟时基因富集分析实战:从热图模块到通路解析

1. Monocle2拟时分析基础回顾 如果你正在做单细胞转录组分析&#xff0c;肯定对拟时分析&#xff08;Pseudotime Analysis&#xff09;不陌生。简单来说&#xff0c;这就像给细胞拍"成长视频"&#xff0c;把静态的细胞状态连成动态的发展轨迹。Monocle2作为这个领域的…...

libusb+zadig实战:Windows USB设备驱动快速配置指南

1. 为什么需要libusb和zadig组合&#xff1f; 如果你在Windows系统上开发过USB设备应用&#xff0c;大概率遇到过这样的场景&#xff1a;明明代码逻辑没问题&#xff0c;设备也连接正常&#xff0c;但程序就是无法正常访问USB设备。这种情况往往是因为Windows系统的安全机制在…...

探索开源字体商用解决方案:思源宋体TTF的多场景应用与价值解析

探索开源字体商用解决方案&#xff1a;思源宋体TTF的多场景应用与价值解析 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 副标题&#xff1a;免费商用授权与多场景适配的专业中文字体…...