【JavaWeb】 三大组件之过滤器 Filter

news2024/11/17 17:42:55

🎄欢迎来到@边境矢梦°的csdn博文,本文主要讲解Java 中三大组件之过滤器 Filter的相关知识🎄


🌈我是边境矢梦°,一个正在为秋招和算法竞赛做准备的学生🌈
🎆喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路🎆

Ps: 月亮越亮说明知识点越重要 (重要性或者难度越大)🌑🌒🌓🌔🌕   

目录

🌕前言 : 

🌔一.  问题引出

🌓二.Filter的介绍

🌕三. 基本原理

🌓四. Filter 过滤器 url-pattern

🌕五. Filter 过滤器生命周期

🌓六.  FilterConfig

🌔七. FilterChain 过滤器链


🌸前言 : 

📌📌📌           拦截请求,过滤响应

过滤器(Filter)是Java Web应用中的一种组件,它在请求到达Servlet或JSP之前或者响应送回客户端之前,对请求和响应进行预处理和后处理操作。通过使用过滤器,可以对请求进行过滤,拦截请求,修改请求参数,在请求被处理之前进行一些预处理操作;同时也可以对响应进行过滤,对响应内容进行修改,添加一些额外的处理。


🌸一.  问题引出

之前我们在做项目的时候, 如果要防止用户直接访问已经登录了的界面, 那么我们会用session来进行限制, 如果登录过的人, 就将登录信息add 到 session, 用户直接访问登录界面的时候就根据用户的sessionId进行查找, 如果有该用户, 那么就让其进行访问, 如果没有那么就跳转到登录窗口, 让其进行登录.

在这个过程中, session相当于一个过滤器, 将没有登录的人过滤出来, 重新进行登录.

但是这种应用只适合一个Servlet, 一个网页, 没有高效的进行过滤, 所以要寻找一种技术, 可以对多个请求Servlet的请求进行过滤, 提高代码效率, 主要是以下六点 : 

  1. 业务逻辑分离:过滤器能够将与业务逻辑无关的通用功能与具体的业务逻辑进行分离,使得代码结构更加清晰和易于管理。通过将不同的功能封装在不同的过滤器中,可以提高代码的可读性和可维护性。

  2. 代码复用性:通过使用过滤器,可以将通用的处理逻辑在多个Servlet或JSP中实现复用,避免了在每个Servlet或JSP中重复编写相同的代码片段,提高了代码的复用性和开发效率。

  3. 通用功能的集中管理:过滤器允许将多个通用功能集中在一起,并在一个地方进行管理。这样可以更好地控制和维护通用功能,减少了修改和扩展的工作量。同时,也方便对某一功能进行集中优化或调整。

  4. 安全性增强:过滤器可以用于实现身份验证、权限控制等安全功能,对用户请求进行安全过滤,拦截恶意请求,防止跨站脚本(XSS)攻击和其他网络安全威胁。通过统一管理和处理,可以提高Web应用的安全性。

  5. 日志和性能监控:过滤器可以用于记录请求和响应的详细信息,包括URL、参数、IP地址等,方便日志记录和性能监控。对于大型应用程序,过滤器的日志记录可以帮助快速定位问题和分析性能瓶颈。

  6. 请求和响应处理的统一性:通过过滤器,可以对请求和响应进行统一处理和修改。例如,可以对请求参数进行校验和过滤,对响应内容进行处理和封装,使得请求和响应的处理具有一致性和规范性。


二.Filter的介绍

1. Filter 过滤器它是 JavaWeb 的三大组件之一 (Servlet 程序、 Listener 监听器、 Filter 滤器 )
2. Filter 过滤器是 JavaEE 的规范,是接口
3. Filter 过滤器它的作用是:拦截请求,过滤响应。
4. 应用场景
        ● 权限检查
        ● 日记操作
        ● 事务管理

三. 基本原理


四. Filter 过滤器 url-pattern

1 url-pattern : Filter 的拦截路径 , 即浏览器在请求什么位置的资源时,过滤器会进行拦截过
2. 、精确匹配 <url-pattern>/a.jsp</url-pattern> 对应的 请求地址 http://ip[ 域名 ]:port/ 工程 路径 /a.jsp 会拦截
3 、目录匹配 <url-pattern>/manage/*</url-pattern> 对应的 请求地址 http://ip[ 域名 ]:port/ 工程路径 /manage/xx , web 工程 manage 目录下  所有资源 会拦截

4 、后缀名匹配 <url-pattern>*.jsp</url-pattern> 后缀名可变,比如 *.action *.do 等等对应 的请求地址 http://ip[ 域名 ]:port/ 工程路径 /xx.jsp , 后缀名为 .jsp 请求会拦截
5 Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在

五. Filter 过滤器生命周期

Filter(过滤器)在 Web 应用程序中具有生命周期,包括初始化和销毁两个阶段。其生命周期由 Web 容器负责管理。

  1. 初始化阶段:

    • 当 Web 容器启动时,会检测并创建配置文件(如 web.xml)中定义的 Filter。
    • 创建 Filter 实例,并调用 init() 方法进行初始化。
    • 在 init() 方法中,可以进行一些一次性的初始化操作,如加载配置文件、创建资源等。
  2. 请求处理阶段:

    • 在 Web 应用程序启动后,Filter 可以拦截、处理和修改来自客户端的请求和服务器的响应。
    • 当有请求到达时,Web 容器会调用 Filter 的 doFilter() 方法,并传递请求和响应对象。
    • 在 doFilter() 方法中,可以编写过滤逻辑,检查请求、修改请求或响应的内容,以及将请求传递给下一个 Filter 或目标资源。
    • 如果存在多个 Filter,它们会按照 Filter 链的顺序依次执行。
  3. 销毁阶段:

    • 当 Web 容器关闭或重启时,会销毁已创建的 Filter 实例。
    • 调用 Filter 的 destroy() 方法进行销毁。
    • 在 destroy() 方法中,可以执行一些清理操作,如释放资源、关闭连接等。

需要注意的是,在 Filter 的生命周期中,init() 和 destroy() 方法仅在 Filter 实例创建和销毁时调用一次,而 doFilter() 方法每次请求被拦截时都会被调用。

可以在 Filter 的 init() 方法中进行一些初始化配置的操作,如读取配置文件、初始化资源等。在 destroy() 方法中可以释放资源,做一些清理工作。

利用 Filter 的生命周期,开发人员可以在请求处理过程中实现自定义的逻辑,并对请求和响应进行处理、修改或增强。

同时,Servlet 3.0 引入了注解配置,可以使用 @WebFilter 注解来配置过滤器,并使用 initParams 和 destroyMethod 属性来设置初始化参数和销毁方法。

@WebFilter(urlPatterns = {"/example"}, initParams = {@WebInitParam(name = "param", value = "value")})
public class MyFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化逻辑
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 过滤逻辑
    }

    public void destroy() {
        // 销毁逻辑
    }
}

六.  FilterConfig

FilterConfig 接口是在 Servlet 过滤器中使用的一个对象,它提供了用于获取过滤器配置信息的方法当过滤器被初始化时,Web 容器将会创建一个 FilterConfig 对象,并将其作为参数传递给过滤器的 init() 方法。

FilterConfig 接口定义了以下方法:

  1. getFilterName():获取过滤器的名称。

    String getFilterName();
    
  2. getInitParameter(String name):根据参数名称获取初始化参数的值。

    String getInitParameter(String name);
    
  3. getInitParameterNames():获取所有初始化参数的名称。

    Enumeration<String> getInitParameterNames();
    
  4. getServletContext():获取 ServletContext 对象。

    ServletContext getServletContext();
    

FilterConfig 对象的主要作用是在过滤器初始化时,提供过滤器的配置信息、初始化参数和 servlet 上下文等。使用 FilterConfig 对象,我们可以获取过滤器的名称、获取指定的初始化参数值以及获取 ServletContext 对象,进而访问全局的 Servlet 上下文。

在过滤器的 init() 方法中,可以通过 FilterConfig 参数获取这些信息,并进行相应的处理和配置。

示例:

public class MyFilter implements Filter {
    private FilterConfig filterConfig;

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;

        String filterName = filterConfig.getFilterName();
        String initParamValue = filterConfig.getInitParameter("initParamName");
        Enumeration<String> initParamNames = filterConfig.getInitParameterNames();
        ServletContext servletContext = filterConfig.getServletContext();

        // 进行相关的初始化操作
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 过滤逻辑
    }

    public void destroy() {
        // 销毁逻辑
    }
}

七. FilterChain 过滤器链

过滤器链是用于按照顺序执行多个过滤器的组件,通过调用 FilterChain 的 doFilter() 方法来传递请求和响应,实现过滤器的协作和控制流。

 

FilterChain(过滤器链)是在 Web 应用程序中使用的一个组件,用于管理多个过滤器的执行顺序和控制流。当一个请求到达时,Web 容器将会按照过滤器配置的顺序依次调用每个过滤器的 doFilter() 方法,形成一个过滤器链。

过滤器链的作用是让多个过滤器按照一定顺序对请求进行处理和过滤,并将请求传递给下一个过滤器,直到达到最终的目标资源(如 Servlet、JSP 等)。

FilterChain 接口定义了以下方法:

   doFilter(ServletRequest request, ServletResponse response):执行下一个过滤器或目标资源的逻辑。

void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException;

在每个过滤器的 doFilter() 方法中,可以调用 FilterChain 的 doFilter() 方法来传递请求和响应给下一个过滤器,或者传递给目标资源。如果没有调用 doFilter() 方法,过滤器链将会被中断,请求将不会继续传递。

示例:

public class MyFilter1 implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化逻辑
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 过滤逻辑

        // 调用下一个过滤器或目标资源
        chain.doFilter(request, response);
    }

    public void destroy() {
        // 销毁逻辑
    }
}

public class MyFilter2 implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化逻辑
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 过滤逻辑

        // 调用下一个过滤器或目标资源
        chain.doFilter(request, response);
    }

    public void destroy() {
        // 销毁逻辑
    }
}

在上述示例中,有两个过滤器 MyFilter1 和 MyFilter2,它们按照配置顺序执行。在每个过滤器的 doFilter() 方法中,首先处理自定义的过滤逻辑,然后调用 chain.doFilter(request, response) 来传递请求和响应给下一个过滤器或目标资源。

过滤器链的执行顺序由过滤器的配置顺序决定,可以通过修改 web.xml 文件或使用注解配置来定义过滤器的顺序。


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

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

相关文章

python 实现k-means聚类算法 银行客户分组画像实战(超详细,附源码)

想要数据集请点赞关注收藏后评论区留言留下QQ邮箱 k-means具体是什么这里就不再赘述&#xff0c;详情可以参见我这篇博客 k-means 问题描述&#xff1a;银行对客户信息进行采集&#xff0c;获得了200位客户的数据&#xff0c;客户特征包括以下四个1&#xff1a;社保号码 2&am…

性能调试【学习笔记】

什么是调优&#xff1f; 每执行一个Java命令&#xff0c;就分配一个JVM&#xff0c;调优时不要混淆。 根据需求进行JVM规划和预调优优化运行JVM的运行环境&#xff08;慢、卡顿&#xff09;解决JVM运行过程中出现的各种问题&#xff08;内存泄露、内存溢出OOM&#xff09; 生…

DSP定点数的概念和表示方法

1. 基本概念 (1) 计算机中定点数的三种表示方法&#xff1a;原码、补码和反码 (2) 在DSP中一般使用补码的形式来表示操作数 (3) 整型数的表示范围由DSP芯片的字长决定&#xff0c;比如16位或24位 (4) 注意&#xff0c;符号位的bit个数&#xff0c;不同类型的数以及不同的DS…

计算机是如何工作的(笔记)

目录 寄存器 操作系统 进程&#xff08;process&#xff09; CPU pcb中关于进程调度相关的属性 寄存器 用来存储数据的单位&#xff0c;是CPU的一部分 寄存器&#xff0c;存储空间更小&#xff0c;访问速度更快&#xff0c;成本更高&#xff0c;掉电后数据会丢失 寄存器…

在线协作设计工具都有哪些?推荐这10款

协作设计是一个复杂而乏味的设计过程系统&#xff0c;不仅需要许多设计师同时进行在线设计协作&#xff0c;而且还包含了许多团队角色。 因此&#xff0c;为了协同设计高质量的产品&#xff0c;更好地服务客户服务&#xff0c;选择高质量的设计协作软件已成为许多设计师的首要…

C++sokcet网络编程笔记

C网络编程 TCP/IP协议 网络介质层&#xff1a;将模拟信号转化成数字信号&#xff0c;会形成一个MAC地址&#xff08;本机地址&#xff0c;一般情况下不会变化&#xff09;。百兆宽带用4根线&#xff0c;千兆宽带用8根线进行传输。 网络层&#xff1a;进行网络层的通讯&#x…

数据结构 | 递归

目录 一、何谓递归 1.1 计算一列数之和 1.2 递归三原则 1.3 将整数转换成任意进制的字符串 二、栈帧&#xff1a;实现递归 三、递归可视化 四、谢尔平斯基三角形 五、复杂的递归问题 六、动态规划 一、何谓递归 递归是解决问题的一种办法&#xff0c;它将问题不断地分…

本地mvn仓库清理无用jar包

背景 开发java时间久了&#xff0c;本地的m2仓库就会产生很多过期的jar包&#xff0c;不清理的话比较占空间。 原理 是通过比较同一目录下&#xff0c;对应jar包的版本号的大小&#xff0c;保留最大版本号那个&#xff0c;删除其他的。 脚本 执行脚本见文章顶部 执行方式 …

P3374 【模板】树状数组 1 浅谈树状数组 (内附封面)

【模板】树状数组 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某一个数加上 x x x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n , m n,m n,m&#xff0c;分别表示该数列数字的个数和操作的总个数。 第二…

部署安装私服-Gitlab

一、国内的gitlab是极狐 www.gitlab.cn 国服 www.github.com 国际服 二、国服的gitlab蛮适合中国国情的 1.提交申请可以获得30天的订阅版服务&#xff0c;有需要的话可以先提交一下。订阅后功能多一些。 Gitlab中文官网下载_GitLab免费下载安装_极狐GitLab免…

从零开始学python(十四)百万高性能框架scrapy框架

前言 回顾之前讲述了python语法编程 必修入门基础和网络编程&#xff0c;多线程/多进程/协程等方面的内容&#xff0c;后续讲到了数据库编程篇MySQL&#xff0c;Redis&#xff0c;MongoDB篇&#xff0c;和机器学习&#xff0c;全栈开发&#xff0c;数据分析&#xff0c;爬虫数…

uniapp 视频截图

uniapp 视频截图 本文只针对微信小程序&#xff0c;其他平台并没有测试过&#xff0c;不确定可行性。 微信提供了两个组件可以用来播放视频&#xff1a; live-player: 只要用于实时音视频的播放&#xff08;出于政策和合规的考虑&#xff0c;微信暂时没有放开所有小程序对&l…

地统计学空间插值方法及应用

地统计学 地统计学&#xff0c;是指以具有空间分布特点的区域化变量理论为基础&#xff0c;研究自然现象的空间变异与空间结构的一门学科。它是针对像矿产、资源、生物群落、地貌等有着特定的地域分布特征而发展的统计学。由于最先在地学领域应用&#xff0c;故称地统计学 地…

自学网络安全(黑客)学习心得路线规划

趁着今天下班&#xff0c;我花了几个小时整理了下&#xff0c;非常不易&#xff0c;希望大家可以点赞收藏支持一波&#xff0c;谢谢。 我的经历&#xff1a; 我 19 年毕业&#xff0c;大学专业是物联网工程&#xff0c;我相信很多人在象牙塔里都很迷茫&#xff0c;到了大三大…

html | 无js二级菜单

1. 效果图 2. 代码 <meta charset"utf-8"><style> .hiddentitle{display:none;}nav ul{list-style-type: none;background-color: #001f3f;overflow:hidden; /* 父标签加这个&#xff0c;防止有浮动子元素时&#xff0c;该标签失去高度*/margin: 0;padd…

4年测试工程师,常用功能测试点总结,“我“不再走弯路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 输入框测试 1、字…

模电专题-MOS管的放大电路分析

在实际应用中&#xff0c;我们经常会使用到功率MOS&#xff0c;这时通常不会将它当成一个开关使用&#xff0c;而是当成一个放大器来使用&#xff0c;那这就需要让其工作在放大状态。 参考下图中的mos管的特性曲线&#xff0c;右图中的输出特性曲线中有一根红色的分界线&#x…

2000-2021年上市公司常用控制变量数据(A股)含stata处理代码

2000-2021年上市公司企业A股常用控制变量 1、时间&#xff1a;2000-2021年&#xff08;注&#xff1a;股权性质从2004年开始&#xff0c;第一大股东持股比例从2003年开始&#xff09; 2、来源&#xff1a;整理自csmar 和wind 3、数据范围&#xff1a;A股公司 不包含已退市的…

使用Python动画粒子的薛定谔波函数(ψ)(完整代码)

使用Python动画粒子的薛定谔波函数&#xff08;ψ&#xff09;&#xff08;完整代码&#xff09; 使用曲柄-尼科尔森方法求解盒子中的粒子 Kowshik chilamkurthy 以后 发表于 书技术 4 分钟阅读 2月 2021&#xff0c; <> 1.4K 5 左图&#xff1a;来源&#xff0c;右图…

Leetcode-每日一题【剑指 Offer 56 - II. 数组中数字出现的次数 II】

题目 在一个数组 nums 中除一个数字只出现一次之外&#xff0c;其他数字都出现了三次。请找出那个只出现一次的数字。 示例 1&#xff1a; 输入&#xff1a;nums [3,4,3,3]输出&#xff1a;4 示例 2&#xff1a; 输入&#xff1a;nums [9,1,7,9,7,9,7]输出&#xff1a;1 限制…