JavaWeb--过滤器

article/2025/8/25 12:48:32

过滤器

  • 一、初识过滤器
    • 1.过滤器简介
    • 2.执行原理
    • 3.过滤器相关API和方法
    • 4.Filter的编写
    • 5.Filter的生命周期
    • 6.责任链设计模式
  • 二、编写身份过滤器
  • 三、过滤器的相关案例
    • 1.使用过滤器统计访问次数
    • 2.计算页面响应时间

一、初识过滤器

1.过滤器简介

Filter(过滤器)是对Web资源进行拦截的对象
一般来说在过滤器中做一些逻辑处理以后再交给下一个过滤器或Servlet来处理,它一般是用来拦截请求进行处理,也可以对返回的响应进行拦截处理

2.执行原理

在正式学习过滤器之前,先来看看在没有学习过滤器的时候,简单的通信流程是怎么样的
在这里插入图片描述
那么我们为什么要学习这个技术呢,在没有学这个技术之前,我们在执行Servlet的时候,可能不同的Servlet之间有共同的方法,但是要分别写,这样无法达到代码的复用,我们使用过滤器就可以解决这样的问题
过滤器可以解决代码复用问题,我们一般在过滤器中写公共的代码,Filter可以在Servlet目标程序执行之前添加代码,也可以在执行之后添加代码,也就是添加过滤的原则
在这里插入图片描述

3.过滤器相关API和方法

主要的API是

  • Filter

想要创建过滤器,一定要实现Filter接口
在这里插入图片描述

  • FilterChain

FilterChain接口负责调用链中的下一个过滤器或者资源,这一个对象在Filter接口的doFilter方法中传递,这个接口只有一个方法
public void doFilter(HttpServletRequest request,HttpServletResponse response):它将控件传递给下一个过滤器或资源。

  • FilterConfig

4.Filter的编写

这里以Tomcat10版本为例

  1. 写一个类实现jakarta.servlet.Filter接口,并且实现里面的方法
    init–在Filter对象第一次被创建之后调用,而且只调用一次
    doFilter–用户发送一次请求,就会执行一次方法,类似于Servlet的servlce方法,在这个方法中编写过滤原则
    destroy—在Filter对象被释放或销毁之前释放并且只执行一次
  2. 在web.xml中对Filter进行配置,这个配置和Servlet很相似
  3. 注意:
    Servlet对象默认在服务器启动的时候,是不会新建对象的
    Filter对象默认在服务器启动的时候,会新建对象
    Servlet和Filter都是单例的,都只创建一个对象
  4. 如果Servlet和Filter对应的路径是一样的,那么就会执行Filter,不会执行Servlet,如果想要让程序继续执行,就应该加上这样的代码
这个代码是我学习的时候用来测试的@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("Filter1的doFilter方法执行");//执行下一个过滤器,如果下一个不是过滤器,则执行目标程序//程序往下走,一定要有这个代码chain.doFilter(request, response);//在响应的时候添加过滤规则System.out.println("doFilter方法执行结束");}

在浏览器输入http://localhost:8080/filter/a.do

@WebFilter("/a.do")
public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("AServlet的doGet方法执行");}
}

程序执行结果

Filter1的doFilter方法执行
AServlet的doGet方法执行
doFilter方法执行结束
  1. 写请求路径的注意点:
    @WebFilter(“*.do”) 模糊匹配中的扩展匹配 这种路径不要以/开始,匹配所有以.do结尾的路径
    @WebFilter(“/*”)匹配所有路径 “/*”
    @WebFilter(“/a/*”)前缀匹配,匹配所有以a开头的路径
  2. 我们的目标Servlet程序如果想要执行,需要满足两个条件:
    1. 过滤器是否编写 chain.doFilter(request, response);
    2. 用户发送的请求路径是否和Servlet对应的路径一样
  3. chain.doFilter(request, response);的作用:
    执行下一个过滤器,如果没有,则执行最终的Servlet程序
  4. Filter优先级比Servlet高
  5. 在配置文件中,Filter的优先顺序问题
    如果在配置文件写了配置信息,根据<filter -mapping> 标签的位置,来判断优先顺序,从上往下优先级递减。
    如果是通过注解来配置,那么过滤器的优先顺序是根据过滤器的名字来定。FilterA比FilterB先执行,Filter1比Filter2先执行
  6. 过滤器调用顺序遵循栈数据结构

5.Filter的生命周期

Filter的生命周期和Servlet一致
有一点不同的是Filter在服务器启动的时候默认会创建对象,而Servlet不会

6.责任链设计模式

Filter这里涉及责任链设计模式,就类似下面的代码
不过下面的代码有一个问题,在编译阶段就已经把调用顺序确定了,如果我们想要改变调用顺序的话,就得改变源代码,违背OCP开闭原则
在这里插入图片描述
过滤器的优点就是在程序编译阶段,不会确定调用顺序,因为Filter调用顺序是配置到web.xml中,我们只需要修改配置文件 <filter - mapping >信息就可以改变Filter的执行顺序,Filter的执行顺序是在运行阶段动态组合的,这种设计模式叫做责任链设计模式。

责任链设计模式思想:程序运行阶段动态组合程序执行顺序。
过滤器一般配置在web.xml,而不是通过注解配置
在这里插入图片描述

二、编写身份过滤器

思路:在过滤器进行身份验证,如果用户名和密码正确,则转发到目标程序
在这里插入图片描述
使用过滤器进行过滤

package com.bjpowernode.filter;import jakarta.servlet.*;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jdk.nashorn.internal.ir.IfNode;import java.io.IOException;
import java.io.PrintWriter;/*** @author zengyihong* @create 2022--04--07 16:12*/
public class LoginFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain  chain) throws IOException, ServletException {HttpServletRequest request=(HttpServletRequest) servletRequest;String username = request.getParameter("username");String password = request.getParameter("password");HttpServletResponse response=(HttpServletResponse) servletResponse;PrintWriter writer = response.getWriter();response.setContentType("text/html");/*** 用户名和密码正确就去执行相应的目标程序* 否则就让它继续登录*/if("admin".equals(username) && "123".equals(password)){chain.doFilter(request,response);}else {/*** 账户密码不匹配* 就显示登录错误,并且让它重新登录*/writer.println("登录信息错误,请重新输入"+"<br>");RequestDispatcher requestDispatcher = request.getRequestDispatcher("/index.jsp");
//            response.sendRedirect(request.getContextPath()+"/index.jsp");requestDispatcher.include(request,response);}}
}

目标程序
在这里插入图片描述

测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里涉及到了Servlet的转发,重定向,包含等知识,大家可以看我博客的文章https://blog.csdn.net/qq_52797170/article/details/123464381

三、过滤器的相关案例

1.使用过滤器统计访问次数

在这里插入图片描述
在这里插入图片描述

这里有一个要注意的地方
cnt要设置成静态变量,不然的话每次访问都显示只有1次
在这里插入图片描述

2.计算页面响应时间

  public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {resp.setContentType("text/html;charset=utf-8");PrintWriter out=resp.getWriter();long before=System.currentTimeMillis();chain.doFilter(req,resp);long after=System.currentTimeMillis();out.print("<br/>总响应时长: "+(after-before)+" 毫秒");out.close();}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/ssLh4NdA.shtml

相关文章

javaWeb过滤器--filter-概述

javaWeb过滤器–filter-概述 filter-概述 Filter是什么&#xff1f; Java Web开发有三大组件:Servlet Filter Listener Filter有什么作用&#xff1f; 过滤器实际上就是对web资源进行拦截&#xff0c;做一些处理后再交给下一个过滤器或servlet处理有什么特点? 通常都是用来拦…

java过滤器和拦截器的使用及其区别

1.过滤器&#xff1a; 依赖于servlet容器。在实现上基于函数回调&#xff0c;可以对几乎所有请求进行过滤&#xff0c;但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作&#xff0c;获取我们想要获取的数据&#xff0c;比如&#x…

Java过滤器Filter讲解(Java基础)

文章目录 一、什么是过滤器二、如何编写过滤器三、 过滤器的配置四、Filter的生命周期五、多个Filter的执行顺序 一、什么是过滤器 Filter也称之为过滤器&#xff0c;它是Servlet技术中最激动人心的技术&#xff0c;WEB开发人员通过Filter技术&#xff0c;对web服务器管理 的所…

Java过滤器的创建与使用

工作原理 过滤器顾名思义&#xff0c;一个容器可以将一堆东西经过过滤筛选去除不想要的部分&#xff0c;保留想要的部分。就如同净水器一样&#xff0c;将水中的杂质过滤&#xff0c;保留纯净的饮用水。而Java中的过滤器是对web资源进行拦截&#xff0c;做一些处理后再交给下一…

Java 过滤器Filter

一&#xff1a;Filter简介 Filter也称之为过滤器&#xff0c;它是Servlet技术中最实用的技术&#xff0c;Web开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff1a;例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截&#xff0c;从而实现一些特…

javaWeb项目中如何使用过滤器

过滤器就是在源数据和目的数据之间起过滤作用的中间件。 Web应用中&#xff0c;在处理请求时&#xff0c;经常有一些公共的工作&#xff0c;比如设置字符集。这样的工作需要写在每个页面&#xff0c;这样的写法费力且不好修改。使用过滤器就像在这些流程前加了一道拦&#xff0…

Java之拦截器与过滤器

拦截器与过滤器 流程图 拦截器vs过滤器 拦截器是SpringMVC的技术 过滤器的Servlet的技术 先过过滤器&#xff0c;过滤器过完才到DispatcherServlet&#xff1b; 拦截器归属于SpringMVC&#xff0c;只可能拦SpringMVC的东西&#xff1b; 拦截器说白了就是为了增强&#xf…

总结:java中过滤器和拦截器的区别?

【扩展】 过滤器&#xff1a;Filter 概念&#xff1a;对目标资源的请求和响应进行过滤截取。在请求到达servlet之前&#xff0c;进行逻辑判断&#xff0c;判断是否放行到servlet&#xff1b;也可以在一个响应response到达客户端之前进行过滤&#xff0c;判断是否允许返回客户端…

Java过滤器Filter使用详解

<div id"post_detail"> 转载请注明原文地址&#xff1a;http://www.cnblogs.com/ygj0930/p/6374212.html 在我的项目中有具体应用&#xff1a;https://github.com/ygj0930/CoupleSpace 过滤器 过滤器是处于客户端与服务器资源文件之间的一道过滤网&#xff0c;…

java中拦截器和过滤器详解

1 过滤器和拦截器的异同 1.1 一张图表明两者之间的差异&#xff1a; tomcat&#xff0c;filter&#xff0c;servet&#xff0c;interceptor以及controller等各种容器的关系图 1.2 两者的区别&#xff1a; 拦截器是基于java的反射机制的&#xff0c;而过滤器是基于函数回调。 …

【java】Filter过滤器

强烈推荐一个大神的人工智能的教程&#xff1a;http://www.captainai.net/zhanghan 一、简介 Filter也称为过滤器&#xff0c;是Servlet中的一项技术&#xff0c;可以管理Web服务器管理的一系列资源&#xff0c;例如jsp,html等。Servlet API中提供了一个Filter接口&#xff0c…

[Java]过滤器(Filter)

一、什么是过滤器 过滤器是Servlet的高级特性之一&#xff0c;是实现Filter接口的Java类&#xff01; 过滤器的执行流程&#xff1a; 从上面的图我们可以发现&#xff0c;当浏览器发送请求给服务器的时候&#xff0c;先执行过滤器&#xff0c;然后才访问Web的资源。服务器响应…

Java中的过滤器Filter

本文用于学习所用&#xff0c;有不足及错误之处欢迎指出和补充。 目录 一&#xff1a;Filter简介 二&#xff1a;关于Filter &#xff08;一&#xff09;如何使用Filter进行过滤 &#xff08;二&#xff09;过滤器链 (FilterChain) &#xff08;三&#xff09;Filter的配置…

Java之过滤器

一.基本定义: 过滤器实际上就是对web资源进行拦截&#xff0c;做一些处理后再交给下一个过滤器或servlet处理 通常都是用来拦截request进行处理的&#xff0c;也可以对返回的response进行拦截处理 二.新建一个Filter: 可以直接new一个Filter类.输入过滤器名称&#xff0c;跟创…

java过滤器(Filter)

目录 1 过滤器简介 2 Filter详细介绍 3 Filter的用法 3.1 用法1 3.2 用法2 1 过滤器简介 filter也称之为过滤器&#xff0c;它是javaWeb三大组件之一&#xff08;Servlet程序、Listener监听器、Filter过滤器&#xff09; 作用&#xff1a;既可以对请求进行拦截&#xff0…

Java Web之过滤器(Filter)

过滤器(Filter) 过滤器实际上就是对web资源进行拦截&#xff0c;做一些处理后再交给下一个过滤器或servlet处理 通常都是用来拦截request进行处理的&#xff0c;也可以对返回的response进行拦截处理 大概流程图如下 应用场景 自动登录 统一设置编码格式 访问权限控制 敏感字符…

C#生成二维码和条形码并实现打印的功能

转载&#xff1a;https://www.cnblogs.com/xixim/p/4589078.html 下载地址&#xff1a;http://pan.baidu.com/s/1kTr3Vuf Step1&#xff1a;使用VS2010新建一个窗体程序项目&#xff1a; Step2&#xff1a;添加三个类&#xff1a;分别是BarCodeClass.cs、DocementBase.cs、im…

web项目js调用斑马打印机打印二维码

斑马打印机打印二维码 项目&#xff08;Web项目&#xff09;功能中存在生成并打印二维码的功能&#xff0c;需要借助打印机打印出二维码。由于业务需求二维码需要打印在不干胶的材料上并可以进行粘贴&#xff0c;所以借助斑马打印机通过热敏不干胶纸进行打印。 需要结合所使用…

python实现扫描二维码并打印数据

编译环境 1、操作系统&#xff1a;windows 10 2、语言&#xff1a;python 3.7.0 3、编辑器&#xff1a;pycharm-community-2018.2.8 4、需要提前安装的库&#xff1a;pyzbar、opencv-python 代码 # 首先导入本次所需要的库&#xff0c;最后一个csv是Python自带的csv表格操…

uni-app H5+ 连接蓝牙打印机打印文字及二维码

基于Native.js 实现的连接蓝牙打印机 打印效果图核心代码测试代码运行设备及环境PS&#xff1a;PPS&#xff1a;Demo 打印效果图 核心代码 /*** Description: 蓝牙打印类 基于h5 Native.js* Author: EricLee* Date: 2020-10-14 13:53:23* Param: mod* Return: $*/export cons…