过滤器(Filter)概述

         过滤器是 Java Servlet 规范的一部分,用于在请求到达 Servlet 之前或响应返回客户端之前拦截请求和响应。它可以用于执行各种任务,如请求预处理、响应后处理、身份验证、日志记录等。

过滤器的作用

  • 预处理请求 :在请求到达目标资源(如 Servlet、JSP)之前,对请求进行处理,如设置字符编码、验证用户身份等。
  • 响应后处理响应 :在目标资源处理完请求后,对响应进行处理,如修改响应内容、设置响应头等。
  • 统一处理逻辑 :将一些通用的处理逻辑集中到过滤器中,避免在多个 Servlet 或 JSP 中重复编写相同的代码,提高代码的可维护性和复用性。
  • 控制请求访问 :根据特定条件(如用户角色、请求路径等)决定是否允许请求继续转发到目标资源,实现访问控制。

过滤器的实现步骤

  1. 导包 :确保项目中正确导入了 Servlet API 相关的 JAR 包,这些包通常包含在 Servlet 容器(如 Tomcat)的库文件中。

  2. 编写过滤器类 :创建一个 Java 类,实现 javax.servlet.Filter​ 接口,并重写其三个核心方法:

    • ​init(FilterConfig filterConfig)​ :用于初始化过滤器,当 Web 服务器启动时,会自动调用该方法。可以在这个方法中获取初始化参数、进行资源的加载等操作。例如,图片中的代码在 init​ 方法中输出了过滤器初始化的信息。
    • doFilter(ServletRequest request, ServletResponse response, FilterChain chain)​ :这是过滤器的核心方法,用于拦截请求和响应。在这个方法中,可以对请求进行预处理,然后通过调用 chain.doFilter(request, response)​ 方法将请求传递给下一个过滤器或目标资源,最后进行后处理。图片中的示例代码在 doFilter​ 方法中设置了请求和响应的字符编码,并在请求处理前后分别输出了相应信息。
    • destroy()​ :用于销毁过滤器,当 Web 服务器关闭时,会调用该方法。可以在这个方法中释放资源等操作。图片中的代码在 destroy​ 方法中输出了过滤器销毁的信息。

过滤器的配置

过滤器需要在 web.xml​ 文件中进行配置,或者使用注解的方式进行配置(Servlet 3.0 及以上版本支持)。配置的主要内容包括:

  • 定义过滤器 :使用 <filter>​ 元素定义过滤器的名称(<filter-name>​)和实现类(<filter-class>​)。例如,图片中的 web.xml​ 配置代码定义了一个名为 CharacterEncodingFilter​ 的过滤器,其对应的类为 com.kuang.filter.CharacterEncodingFilter​。
  • 配置过滤器映射 :使用 <filter-mapping>​ 元素指定过滤器所拦截的请求的 URL 模式(<url-pattern>​)或 Servlet 名称(<servlet-name>​)。这样,当匹配到相应的请求时,过滤器就会被调用。图片中的示例配置了过滤器的映射,使其拦截所有以 /servlet/​ 开头的请求。

过滤器的执行顺序

  • 如果有多个过滤器同时拦截同一个请求,它们的执行顺序是由过滤器的映射配置决定的。在 web.xml​ 中,过滤器的映射配置顺序决定了它们的执行顺序,先配置的过滤器先执行。
  • 在请求的预处理阶段,过滤器按照配置顺序依次执行;在响应的后处理阶段,则按照相反的顺序执行。

图解

📌 示例一:字符编码设置过滤器

✅ 1. 过滤器类:filterDemo.java​
public class filterDemo implements Filter {// 定义一个私有变量,用于存储要设置的编码格式,默认值为 "UTF-8"。private String encoding = "UTF-8";@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器初始化");}@Overridepublic void destroy() {System.out.println("过滤器销毁");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding(encoding);response.setCharacterEncoding(encoding);response.setContentType("text/html;charset=" + encoding);chain.doFilter(request, response);}
}
✅ 2. 配置:web.xml​
  <servlet><servlet-name>TestDemo</servlet-name><servlet-class>www.TestDemo.TestDemo</servlet-class></servlet><servlet-mapping><servlet-name>TestDemo</servlet-name><url-pattern>/Test/TestDemo</url-pattern></servlet-mapping><servlet-mapping><servlet-name>TestDemo</servlet-name><url-pattern>/TestDemo</url-pattern></servlet-mapping><filter><filter-name>filterDemo</filter-name><filter-class>www.TestDemo.filterDemo</filter-class></filter><filter-mapping><filter-name>filterDemo</filter-name><url-pattern>/TestDemo</url-pattern></filter-mapping>

       过滤器路径为/TestDemo,如果路径走localhost:8080/FilterDemo_war/TestDemo就会处理中文乱码,路径走localhost:8080/FilterDemo_war/Test/TestDemoz则会显示中文乱码;

📌 示例二:动态生成个性化欢迎语

【LoginServlet.java】

package www.Demo02;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;// 登录请求处理 servlet
public class LoginServlet extends HttpServlet {// 专门处理 POST 请求(表单 method="post")@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");String username = req.getParameter("username");String password = req.getParameter("password");String isVipStr = req.getParameter("isVip");// 如果复选框被勾上,浏览器会带 isVip=true;否则不带;把字符串 "true" 转成布尔值 true/falseboolean isVip = "true".equals(isVipStr);// 硬编码的用户名密码校验if ("admin".equals(username) && "123456".equals(password)) {// 校验成功,把用户名存到 sessionreq.getSession().setAttribute("username", username);// 把是否是 VIP 也存到 session(boolean 自动装箱为 Boolean)req.getSession().setAttribute("isVip", isVip);// 重定向到成功页面resp.sendRedirect("/FilterDemo_war/sys/success.jsp");} else {// 登录失败,重定向到错误页resp.sendRedirect("/FilterDemo_war/sys/error.jsp");}}// 如果浏览器用 GET 访问,也按 POST 方式处理@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}
}

【VipFilter.java】

package www.Demo02;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
// 过滤器:给登录成功的用户动态添加欢迎语
public class VipFilter implements Filter {// 过滤器被容器创建后,仅执行一次,可用来读初始化参数@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("VipFilter init");}// 每次请求都会经过这里@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 把父接口转成 HttpServletRequest,才能用 getSession()HttpServletRequest req = (HttpServletRequest) request;// 参数 false:若 session 不存在,不自动创建而是返回 nullHttpSession session = req.getSession(false);// 1. 判断用户是否已登录(session 存在且里面有 username)if (session != null && session.getAttribute("username") != null) {// 2. 取出登录时存的 isVip 属性Boolean isVip = (Boolean) session.getAttribute("isVip");if (isVip == null) {        // 容错:万一没存,就当成非 VIPisVip = false;}// 3. 根据是否 VIP 准备不同的欢迎语String welcomeMessage;if (isVip) {welcomeMessage = "尊贵的VIP用户,欢迎您的登录";} else {welcomeMessage = "欢迎您的登录";}// 4. 把欢迎语放到 request 域,给 success.jsp 用req.setAttribute("welcomeMessage", welcomeMessage);}// 5. 必须继续往下走,否则请求会被“卡死”在过滤器里chain.doFilter(request, response);}// 容器卸载过滤器时调用,一般做资源清理@Overridepublic void destroy() {System.out.println("VipFilter destroy");}
}

【login.jsp】

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录页面</title>
</head>
<body>
<h2>用户登录</h2>
<!-- 表单提交到 /项目名/LoginDemo,由 LoginServlet 处理 -->
<form action="${pageContext.request.contextPath}/LoginDemo" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br>是否为会员:<input type="checkbox" name="isVip" value="true"><br><input type="submit" value="登录">
</form>
</body>
</html>

【success.jsp】

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><!-- 过滤器在 request 域里放的欢迎语 --><h1>${requestScope.welcomeMessage}</h1><!-- session 域里放的用户名 --><h3>${sessionScope.username}!</h3>
</body>
</html>

【web.xml】

<!-- 项目测试2 -->
<servlet><servlet-name>LoginServlet</servlet-name><servlet-class>www.Demo02.LoginServlet</servlet-class>
</servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/LoginDemo</url-pattern>
</servlet-mapping><!-- 注册 VipFilter -->
<filter><filter-name>VipFilter</filter-name><filter-class>www.Demo02.VipFilter</filter-class>
</filter>
<!-- 凡是访问 /sys/* 路径的请求,都要先过 VipFilter -->
<filter-mapping><filter-name>VipFilter</filter-name><url-pattern>/sys/*</url-pattern>
</filter-mapping><!-- 全局 session 超时时间:1 分钟(仅做演示) -->
<session-config><session-timeout>1</session-timeout>
</session-config>
示例2总结:
  1. 登录:login.jsp → LoginServlet,验证 admin/123456 并把用户名、是否 VIP 写进 session。
  2. 过滤:所有访问 /sys/*​ 的请求先走 VipFilter,根据 session 给 request 加上欢迎语。
  3. 展示:success.jsp 读取 request 的欢迎语 + session 的用户名,完成页面渲染

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

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

相关文章

Spring AI 打造智能面试人实战

Spring AI人工智能面试机器人相关实例 以下是与Spring AI人工智能面试机器人相关的实用案例,涵盖技术实现、功能设计及常见问题解决方案,按应用场景分类呈现: 技术集成案例 调用Hugging Face模型库处理专业领域问题 通过Spring Security添加面试会话身份验证 结合WebSoc…

QT 程序发布时候调用自定义动态库

1、需要在pro文件中增加下面的内容&#xff1a;QMAKE_LFLAGS "-Wl,-rpath,\\$$ORIGIN\" QMAKE_LFLAGS "-Wl,-rpath,\\$$ORIGIN/lib\" QMAKE_LFLAGS "-Wl,-rpath,\\$$ORIGIN/../lib\"其中lib为动态库的文件夹名称&#xff0c;可以根据自己喜好…

SpringBoot学习日记 Day6:解锁微服务与高效任务处理

一、开篇&#xff1a;从单体到微服务的思维转变刚开始接触微服务时&#xff0c;我总习惯把所有功能写在一个项目里。直到项目越来越臃肿&#xff0c;每次修改都要全量部署&#xff0c;才意识到微服务架构的价值。今天我们就来探索SpringBoot在微服务场景下的强大能力&#xff0…

机械学习--DBSCAN 算法(附实战案例)

DBSCAN 算法详解DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff0c;带噪声的基于密度的空间聚类应用&#xff09;是一种经典的密度聚类算法&#xff0c;由 Martin Ester 等人于 1996 年提出。与 K-means 等基于距离的聚类算法不同&am…

【昇腾】基于RK3588 arm架构Ubuntu22.04系统上适配Atlas 200I A2加速模块安装EP模式下的驱动固件包_20250808

一、背景 1.1 主要的硬件是&#xff1a;1.2 主要的软件是&#xff1a; RK3588跑操作系统Atlas 200I A2加速模块作为EP模式关键参数版本说明CPU架构aarch64OS版本Ubuntu 22.04.5 LTSkernel版本5.10.198 二、适配 准备固件run包文件&#xff1a;Ascend-hdk-310b-npu-firmware_7.…

如何在 VS Code 中进行 `cherry-pick`

cherry-pick 是 Git 的一个功能&#xff0c;允许你选择某个 commit 并将其应用到当前分支&#xff0c;而无需合并整个分支。在 VS Code 中&#xff0c;你可以通过 内置的 Git 功能 或 终端 来完成 cherry-pick。方法 1&#xff1a;使用 VS Code 的 Git 图形界面&#xff08;GUI…

STM32CubeMX(十三)FatFs文件系统(SPI驱动W25Qxx)

目录 一、知识点 1. 什么是Fatfs文件系统? 2. Fatfs操作系统控制流程 二、实战操作 1.CubeMX配置 2. 配置串口以及SPI 3. 修改功能映射接口 4. 添加测试代码 5. 实验现象 在完成本章之前需要完成一些基础配置,详情查看下面的文章。 STM32CubeMX(二)新建工…

【前端后端部署】将前后端项目部署到云服务器

更多笔记在这里☞ 全栈之路&#xff1a; https://gitee.com/oldbe/notes 【跳转到】 觉得有用请点个 star &#xff0c;非常感谢&#xff01; 现在AI太强大&#xff0c;开发个人产品的门槛和成本太低了&#xff0c;只要你有好的想法都可以很快速的开发一款产品 1.…

vue如何监听localstorage

在Vue中监听localStorage的变化可以通过几种方式实现&#xff0c;但需要注意的是&#xff0c;localStorage本身不提供原生的事件监听机制&#xff0c;如DOM元素的MutationObserver。不过&#xff0c;你可以通过一些间接的方法来监听localStorage的变化。方法1&#xff1a;使用w…

灰狼算法+四模型对比!GWO-CNN-LSTM-Attention系列四模型多变量时序预测

摘要&#xff1a;聚划算&#xff01;大对比&#xff01;灰狼算法四模型对比&#xff01;GWO-CNN-LSTM-Attention系列四模型多变量时序预测&#xff0c;该代码特别适合需要横向对比不同深度学习模型性能的时序预测场景&#xff0c;研究者可通过参数快速适配不同预测需求&#xf…

冒泡排序实现以及优化

一&#xff0c;冒泡排序说明冒泡排序是从第一个元素开始和后面一个元素进行判断是否满足左小右大&#xff0c;如果不满足就交换位置&#xff0c;再拿第二个和第三个进行上述操作一直到第n-1和第n个。经过上述的一轮操作就可以把第一个最大值放到最右边&#xff0c;在进行n轮上述…

水下管道巡检机器人cad【10张】三维图+设计说明书

摘 要 水下管道是水下油气管道的生命线&#xff0c;水下管道巡检机器人可以替代人工完成水下油气管道状态的实时监测和数据反馈&#xff0c;有助于工作人员对水下油气管道的运行情况实时掌握。 本文完成了水下管道巡检机器人的总体设计&#xff0c;采用三维设计软件Solidwor…

SQL(结构化查询语言)的四大核心分类

这张图展示了 SQL&#xff08;结构化查询语言&#xff09;的四大核心分类&#xff0c;分别对应不同的数据库操作场景。以下是逐类解析&#xff1a;1. 数据操作语言&#xff08;DML&#xff1a;Data Manipulation Language&#xff09;作用&#xff1a;用于操作数据库中的数据&a…

AI(1)-神经网络(正向传播与反向传播)

&#x1f34b;&#x1f34b;AI学习&#x1f34b;&#x1f34b;&#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主…

嵌入式Linux学习 - 数据结构6

五、哈希表1. 哈希算法将数据通过哈希算法映射成一个键值&#xff0c;存取都在同一位置实现数据的高效存储和查找将时间复杂度尽可能降低至O(1)2. 哈希碰撞多个数据通过哈希算法得到的键值相同&#xff0c;称为产生哈希碰撞3. 哈希表构建哈希表存放0-100之间的数据将0 - 100之间…

GitHub 趋势日报 (2025年08月07日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图1894nautilus_trader354stagehand315openai-cookbook263sim242ollama230prisma154v…

android 使用openimagelib OpenImage 实现点击放大图片,浏览

在 Android 中使用 OpenImageLib(假设这是一个开源图片加载库,类似于 Glide 或 Picasso)实现 点击放大图片并浏览 的功能,通常需要结合 图片查看器库(如 PhotoView)和 图片加载库(如 OpenImageLib)。以下是完整的实现方案: 1. 添加依赖 (1) 添加 OpenImageLib 依赖 …

计算机视觉CS231n学习(4)

深度学习软件 &#xff08;这一部分去看tensorflow和pytorch的笔记&#xff09; &#xff08;见专栏&#xff09;tensorflow和pytorch区别 tensorflow&#xff0c;我们先构建显示的图&#xff0c;然后重复运行它 pytorch&#xff0c;我们每次做前向传播时&#xff0c;都构建一个…

【具身智能】具身智能的革命——人形机器人如何重塑人类日常生活

还在为高昂的AI开发成本发愁?这本书教你如何在个人电脑上引爆DeepSeek的澎湃算力! 2025年被誉为具身智能的元年,人形机器人技术迅猛发展,将深刻改变人类生活方式。本文从具身智能的核心概念入手,探讨人形机器人的硬件架构、感知系统、运动控制和决策算法等技术基础。结合…

Jira Service Management企业服务管理:IT、HR、法务、财务等部门如何落地现代企业服务管理理念与实践

Jira Service Management 服务管理方法Jira Service Management 服务管理方法将开发、IT运营和业务团队整合至一个统一平台&#xff0c;以实现更高效的协作。任何团队都能够快速响应业务变化&#xff0c;为客户和员工提供卓越体验。Jira Service Management 提供直观、经济高效…