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

JavaWeb的Filter详解

过滤器Filter

  • 什么是Filter?
    • 依据字面上的中文意思为过滤器。
  • Filter的作用
    • 当用户的请求到达指定的URL之前,可以借助Filter来改变这些请求的内容;同样地,当响应结果到达客户端之前,可以使用Filter修改输出的内容。
  • 什么是FilterChain(过滤器链)?
    • 一个FilterChain包含多个Filter。

Filter编程

 过滤器的工作原理

 过滤器的生命周期

 过滤器的部署

在web.xml中配置如下:

<filter><filter-name>Logger</filter-name><filter-class>com.util.LoggerFilter</filter-class>
</filter><filter-mapping><filter-name>Logger</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

示例:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee   http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"  version="4.0">  <!-- 定义Filter -->  <filter>  <filter-name>exampleFilter</filter-name> <!-- Filter的名称 -->  <filter-class>com.example.ExampleFilter</filter-class> <!-- Filter的实现类 -->  <!-- 初始化参数(可选) -->  <init-param>  <param-name>paramName</param-name>  <param-value>paramValue</param-value>  </init-param>  <!-- 其他初始化参数(如果有的话)... -->  </filter>  <!-- Filter映射 -->  <filter-mapping>  <filter-name>exampleFilter</filter-name> <!-- 与上面定义的Filter的名称相对应 -->  <url-pattern>/*</url-pattern> <!-- 指定Filter应用的URL模式,/* 表示应用于所有请求 -->  <!-- 也可以指定多个<url-pattern>,或者使用<servlet-name>来指定应用于哪些Servlet -->  <!-- 其他可选属性,如<dispatcher>,可以指定在哪些类型的请求上应用此Filter,如REQUEST、FORWARD、INCLUDE、ERROR等 -->  </filter-mapping>  <!-- Servlet和其他配置... -->  </web-app>
  • 在这个例子中,filter元素定义了一个名为exampleFilter的过滤器,其实现类是com.example.ExampleFilter
  • 你可以在这个元素内部添加<init-param>元素来定义过滤器的初始化参数,这些参数可以在过滤器的init方法(如果覆盖了Filter接口的init(FilterConfig filterConfig)方法)中通过FilterConfig对象访问。
  • filter-mapping元素定义了过滤器的映射信息,即指定了过滤器应该应用于哪些URL模式或Servlet。在这个例子中,<url-pattern>/*</url-pattern>表示过滤器将应用于Web应用中的所有请求。你也可以通过指定具体的URL模式或Servlet名称来限制过滤器的应用范围。

注意:在servlet3.0版本以上,我们可以直接使用注解的方式快速定义一个过滤器

Filter接口

过滤器是一个对象,它根据用户的请求和资源的响应进行过滤.

Filter接口包含以下方法:

 FilterConfig

FilterConfig是一个接口,它主要用于在过滤器(Filter)的初始化阶段,从web.xml配置文件中获取与过滤器相关的参数信息。

方法名方法描述
getInitParameter(String name)返回在部署描述符(web.xml)文件中指定名称的初始化参数的值。如果找不到该参数,则返回null。
getInitParameterNames()返回一个枚举集合,包含过滤器的所有初始化参数的名字。如果过滤器没有初始化参数,则返回一个空的枚举集合。
getFilterName()返回过滤器在web.xml中声明的名称。
getServletContext()返回表示Servlet上下文的ServletContext对象的引用。

 过滤器的应用场合

  • 加载:对于到达系统的所有请求,过滤器收集诸如浏览器类型,一天中的时间等相关信息,并对它们进行日志记录
  • 性能:过滤器在内容通过线路传来并在到达Servlet和JSP页面之前解压缩该内容,然后再取得响应内容,并在响应内容发送到客户机器之前将它转换为压缩格式
  • 安全:过滤器处理身份验证令牌的管理,并适当地限制安全资源的访问,提示用户进行身份验证或将它们指引到第三方进行身份验证.
  • 会话管理:将Servlet和JSP页面与会话处理代码混杂在一起可能带来相当大的麻烦.使用过滤器来管理会话可以让WEB页面集中精力考虑内容显示和委托处理,而不必担心会话管理的细节.

 Filter经典案例

字符集处理

定义类EncodingFilter实现Filter接口,重写doFilter()方法。

过滤器类

public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {//设置请求字符集request.setCharacterEncoding("GBK");//请求向下传递chain.doFilter(request, response);
}

web.xml配置

<filter><filter-name>EncodingFilter</filter-name><filter-class>com.javaweb.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping><filter-name>EncodingFilter</filter-name><!-- 过滤所有请求 --><url-pattern>/*</url-pattern>
</filter-mapping>

 登陆验证

解决把登录信息放入session会产生大量重复代码的问题

过滤器类

public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpSession session = req.getSession();// 从session中获取用户信息User user = (User) session.getAttribute("user");// 能够从session获取到用户信息,代表用户已经成功登陆过if (user != null) {// 请求向下传递chain.doFilter(request, response);} else {//如果获取不到用户信息,代表用户没有登陆,则转向到登陆页面req.getRequestDispatcher("/login.jsp").forward(request, response);}}

FilterChain过滤链

一个过滤器链(FilterChain),在请求到达请求资源前会依次经过链中的所有过滤器,<filter-mapping>配置在前的Filter先执行,而请求处理完成后,会按照相反的顺序再次经过链中的所有过滤器。

 总结

  • Filter用于对request或者response进行修改。
  • 可以使用Filter处理一些通用的业务操作:
    • 字符集编码
    • 权限验证
    • session管理
    • 日志记录
    • 响应格式设置

相关文章:

JavaWeb的Filter详解

过滤器Filter 什么是Filter&#xff1f; 依据字面上的中文意思为过滤器。Filter的作用 当用户的请求到达指定的URL之前&#xff0c;可以借助Filter来改变这些请求的内容&#xff1b;同样地&#xff0c;当响应结果到达客户端之前&#xff0c;可以使用Filter修改输出的内容。什么…...

【iOS】KVC的学习

【iOS】KVC的学习 文章目录 【iOS】KVC的学习前言KVC定义KVC设值KVC取值KVC使用keyPathKVC处理异常处理nil异常 KVC的一些应用修改动态的设置值实现高阶的消息传递 小结 前言 笔者简单学习了有关与KVC的相关内容&#xff0c;这里写一篇博客简单介绍一下相关内容。 KVC 定义 KV…...

影刀RPA实战:网页爬虫之药品数据

1 实战目标 这次给大家带来的实战示例是采集中国医药信息平台上的药品数据&#xff0c;主要获取药品名称&#xff0c;介绍&#xff0c;药品类型&#xff0c;处方类型&#xff0c;医保类型&#xff0c;参考价格&#xff0c;药品成分&#xff0c;性状&#xff0c;适应病症&#…...

python禁止位置传参函数

这种函数定义方式使用了 Python 3.x 中的关键字参数&#xff08;keyword-only arguments&#xff09;的特性&#xff0c;通过在参数列表中使用 * 符号作为分隔符&#xff0c;来明确指示该函数之后的参数必须使用关键字&#xff08;即参数名&#xff09;来传递&#xff0c;而不能…...

java面试题第一弹

Java 的基本数据类型有哪些&#xff1f; Java 的基本数据类型&#xff08;primitive data types&#xff09;包括以下八种&#xff1a; byte&#xff1a; 尺寸&#xff1a;1 字节&#xff08;8 位&#xff09;。范围&#xff1a;-128 到 127。用途&#xff1a;节省内存&#x…...

住宅HTTP代理:提升网络隐私与安全的新选择

在互联网时代&#xff0c;我们的在线隐私和安全变得越来越重要。无论是浏览网页、进行在线交易&#xff0c;还是访问受限内容&#xff0c;住宅HTTP代理都能为我们提供一种可靠的解决方案。今天&#xff0c;我们就来深入探讨一下住宅HTTP代理&#xff0c;看看它是如何帮助我们提…...

字符串函数(2)

目录 前言1. strlen1.1 strlen函数的理解和使用1.2 strlen函数的模拟实现 2. strcpy2.1 strcpy函数的理解和使用2.2 strcpy函数的模拟实现 3.strcat3.1 strcat函数的理解和使用3.2 strcat 函数的模拟实现 前言 在上一篇文章中&#xff0c;我们对字符分类函数和字符转换函数进行…...

Linux--守护进程与会话

进程组 概念 进程组就是一个或多个进程的集合。 一个进程组可以包含多个进程。 下面我们通过一句简单的命令行来展示&#xff1a; 为什么会有进程组&#xff1f; 批量操作&#xff1a;进程组允许将多个进程组织在一起&#xff0c;形成一个逻辑上的整体。当需要对多个进程…...

C++ 笔试常用算法模板

C 笔试常用算法模板 一、二叉树遍历DFSBFS 二、回溯模板三、动态规划01背包朴素版本滚动数组优化 完全背包朴素版本滚动数组优化 最长递增子序列朴素版本贪心二分优化 最长公共子序列最长回文子串 四、图建图邻接矩阵邻接表 图的遍历DFSBFS 拓扑排序并查集最小生成树Kruskalpri…...

李宏毅2023机器学习作业HW07解析和代码分享

ML2023Spring - HW7 相关信息&#xff1a; 课程主页 课程视频 Kaggle link 回来了 : ) Sample code HW07 视频 HW07 PDF 个人完整代码分享: GitHub | Gitee | GitCode P.S. HW7 的代码都很易懂&#xff0c;可以和 2024 年的新课&#xff1a;生成式AI导论做一个很好的衔接&#…...

ansible远程自动化运维、常用模块详解

一、ansible是基于python开发的配置管理和应用部署工具&#xff1b;也是自动化运维的重要工具&#xff1b;可以批量配置、部署、管理上千台主机&#xff1b;只需要在一台主机配置ansible就可以完成其它主机的操作。 1.操作模式&#xff1a; 模块化操作&#xff0c;命令行执行…...

【若依框架】按时间查询数据的操作

【若依框架】按时间查询数据的操作 若依框架按起止时间查询数据示例&#xff1a; Date tempDate DateUtil.offsetDay(new Date(), -days);Map<String, Object> map new HashMap<>();map.put("beginRecordTime", DateUtil.beginOfHour(tempDate));map.…...

人工智能将来好就业吗?

人工智能将来好就业吗? 随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐成为推动全球经济发展的核心力量之一。从智能机器人到自动驾驶汽车&#xff0c;从语音识别到图像分析&#xff0c;AI正在改变我们的工作方式以及我们与世界的互动方式。那么&am…...

JAVA SE 11

文章目录 JDK 11 特性介绍语法增强1. String类的增强2. Optional类的增强3. 新的HTTP/2客户端4. var关键字的扩展5. Collection接口的增强 语法改进JDK 11引入的一些语法改进 详细介绍1. 模块化系统&#xff08;Java平台模块系统&#xff0c;JPMS&#xff09;2. HTTP客户端3. 改…...

【MySQ】在MySQL里with 的用法

在MySQL中&#xff0c;WITH语句通常与公用表表达式&#xff08;Common Table Expressions&#xff0c;简称CTE&#xff09;一起使用。CTE是一种临时的结果集&#xff0c;类似于视图或子查询&#xff0c;它们在查询中被定义并且可以在一个或多个SELECT、INSERT、UPDATE或DELETE语…...

多源最短路径

文章目录 1. 01 矩阵&#xff08;542&#xff09;2. 飞地的数量&#xff08;1020&#xff09;3. 地图分析&#xff08;1162&#xff09;4. 地图中的最高点&#xff08;1765&#xff09; 1. 01 矩阵&#xff08;542&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 这…...

在 Mac 中设置环境变量

目录 什么是环境变量&#xff0c;为什么它们重要&#xff1f;什么是环境变量&#xff1f;举个例子 如何查看环境变量如何设置和修改环境变量1. 临时设置环境变量2. 永久设置环境变量3. 修改现有环境变量 环境变量在开发中的应用在 Node.js 项目中使用环境变量在 Python 项目中使…...

记录一次ubuntu /mysql/redis/nginx等 系统安装

没想到还会做一次系统安装配置类的工作&#xff0c;没办法&#xff0c;碰到问题了&#xff0c;总得解决。 安装 &网络配置 从网上下载了ubuntu 18.04.6的安装包&#xff0c;用UltraISO做安装盘&#xff0c;到服务器上修改了下启动顺序&#xff0c;ubuntu的安装非常简单&a…...

大型语言模型 (LLM) 劫持攻击不断升级,导致每天损失超过 100,000 美元

Sysdig 威胁研究团队 (TRT) 报告称&#xff0c;LLMjacking&#xff08;大型语言模型劫持&#xff09;事件急剧增加&#xff0c;攻击者通过窃取的云凭证非法访问大型语言模型 (LLM)。 这一趋势反映了 LLM 访问黑市的不断增长&#xff0c;攻击者的动机包括个人使用和规避禁令和制…...

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾收集器

文章目录 垃圾回收机制Stop-the-World垃圾收集器垃圾收集器分类Serial 收集器Serial Old 收集器ParNew 收集器Parallel Scavenge 收集器Parallel Old 收集器CMS 收集器CMS 收集器缺点 G1 收集器G1 收集器特点G1 收集器的分代理念G1 收集器运作过程 垃圾回收机制 垃圾回收&…...

解决企业知识孤岛挑战:Outline多平台文档迁移架构与技术实现方案

解决企业知识孤岛挑战&#xff1a;Outline多平台文档迁移架构与技术实现方案 【免费下载链接】outline Outline 是一个基于 React 和 Node.js 打造的快速、协作式团队知识库。它可以让团队方便地存储和管理知识信息。你可以直接使用其托管版本&#xff0c;也可以自己运行或参与…...

探索Lumerical建模计算可调谐光学手性

Lumerical建模计算可调谐光学手性在光学领域&#xff0c;可调谐光学手性是一个极具吸引力的研究方向。而Lumerical作为一款强大的光学仿真软件&#xff0c;为我们深入探究这一领域提供了有力工具。 什么是可调谐光学手性 光学手性简单来说&#xff0c;描述的是光与物质相互作用…...

React Native vs Flutter:一次深入到底的性能对比分析(含原理 + 实战)

目录 一、先说结论&#xff08;避免踩坑&#xff09; 二、架构对比&#xff1a;性能差异的根源 1. React Native 架构 关键点&#xff1a; 2. Flutter 架构 关键点&#xff1a; 3. 核心差异总结 三、性能对比核心维度 四、启动性能&#xff08;App Launch Time&#x…...

Java毕业设计基于springboot+vue的校内兼职信息管理系统

前言 Spring Boot 校内兼职信息管理系统是以 Spring Boot 框架为核心搭建的&#xff0c;专门用于高效管理校园内各类 兼职信息的平台。随着校园生活的多元化发展&#xff0c;学生对兼职机会的需求日益增长&#xff0c;传统的兼职信息发布与管理方式杂乱无章&#xff0c;存在信息…...

3大突破!零门槛掌握资源嗅探:猫抓插件全平台使用指南

3大突破&#xff01;零门槛掌握资源嗅探&#xff1a;猫抓插件全平台使用指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 一、为什么你需要专业的资源嗅探工具&#xff1f; 场景化痛点直击 作为…...

把 SAP Fiori 远程系统配置讲透:SM59、System Alias、sap-system 与多后端路由实践

在 SAP Fiori launchpad 的真实项目里,用户登录的系统,和应用实际运行、实际取数的系统,往往并不是同一台机器。很多团队在做 PoC 的时候,一切看起来都很顺;一旦进入企业级部署,前端服务器、Gateway、ECC、S/4HANA、SRM 甚至多个区域性后端同时出现,导航失败、取数跑偏、…...

突破性Unity游戏插件框架实战指南:BepInEx从零到精通的完全手册

突破性Unity游戏插件框架实战指南&#xff1a;BepInEx从零到精通的完全手册 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款专为Unity游戏设计的革命性插件框架&…...

为什么选择yfinance:3步实现免费金融数据获取的完整解决方案

为什么选择yfinance&#xff1a;3步实现免费金融数据获取的完整解决方案 【免费下载链接】yfinance Download market data from Yahoo! Finances API 项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance 在金融数据分析的世界里&#xff0c;你是否曾为获取高质…...

可视化是对比原始数据和填补数据的强大工具。你可以使用箱线图、密度图或散点图来可视化原始数据和填补后的数据

下面的内容摘录自《用R探索医药数据科学》专栏文章的部分内容&#xff08;原文5665字&#xff09;。 2篇2章6节&#xff1a;R的多重填补法中随机回归填补法的应用&#xff0c;MICE包的实际应用和统计与可视化评估-CSDN博客 在数据分析中&#xff0c;缺失数据是常见且具有挑战性…...

DAMOYOLO-S与数据库联动:检测结果实时入库与查询

DAMOYOLO-S与数据库联动&#xff1a;检测结果实时入库与查询 你有没有想过&#xff0c;当AI模型在摄像头前“看到”一个人、一辆车时&#xff0c;这些信息除了在屏幕上显示一下&#xff0c;还能做什么&#xff1f;如果这些“看见”的瞬间——谁、在哪儿、什么时候、有多确定—…...