首页 > 编程语言 >Java登陆第三十一天——Filter

Java登陆第三十一天——Filter

时间:2024-01-17 23:12:07浏览次数:20  
标签:Java 请求 Filter doFilter 第三十一 过滤器 servletRequest FilterChain

好好好,好久不见了。不多说,继续干。

Filter即过滤器,专用于过滤客户端所发送的请求。

生活中的过滤器

  1. 筛子

  2. 地铁闸门

  3. 公司前台

  4. 保安

以上举例都是生活中的过滤器。

在代码中,过滤器的作用是控制访问资源。

Filter

所有的过滤器都要实现Filter接口,Filter接口方法如下:

方法名 描述
default void init(FilterConfig filterConfig) 过滤器初始化(可不实现)
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) 过滤器真正工作的方法
default void destroy() 过滤器销毁(可不实现)

过滤器也是有生命周期的,同样也是由Tomcat创建。

接口实现类可以不实现默认方法。

FilterChain是过滤器链,因为过滤器可以有多个。

FilterChain过滤器链

FilterChain接口方法如下:

方法名 描述
void doFilter(ServletRequest var1, ServletResponse var2) 把请求与响应对象传递给服务端

如果把FilterChain当作保安的话,其doFilter方法就是放行,允许通过。

注意!!!

Filter的doFilter()方法是实现过滤器的具体逻辑的方法

FilterChain的doFilter()方法是放行请求与响应的方法。

Filter生效位置

image

在web.xml中配置过滤器映射

    <filter>
        <filter-name>过滤器名称</filter-name>
        <filter-class>过滤器的全类名</filter-class>
    </filter>

    <!--过滤器映射-->
    <filter-mapping>
        <filter-name>过滤器名称</filter-name>
        <url-pattern>过滤器作用的URL1</url-pattern>
        <url-pattern>过滤器作用的URL2</url-pattern>
    </filter-mapping>
  • 一个过滤器映射可以配置多个url-pattern

  • 可以使用通配符/和*

  • 如果有多个过滤器映射,根据web.xml中定义的映射顺序确定过滤器的执行顺序

过滤器栗子

TestFilter7

public class TestFilter7 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setAttribute("temp","过滤器可以修改请求与响应");

        //放行==传递请求和响应给服务端
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

TestServlet7

@WebServlet("/Test7")
public class TestServlet7 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //验证是否还是同一个请求对象
        System.out.println(req.getAttribute("temp"));
    }
}

web.xml

    <filter>
        <filter-name>T7</filter-name>
        <filter-class>com.example.JavaWeb.Filter.TestFilter7</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>T7</filter-name>
        <url-pattern>/Test7</url-pattern>
    </filter-mapping>

客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test7

//控制台输出
过滤器可以修改请求与响应

不放行的栗子

修改上述栗子的TestFilter7,注释掉放行代码

public class TestFilter7 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setAttribute("temp","过滤器可以修改请求与响应");

        //放行==传递请求和响应给服务端
        //filterChain.doFilter(servletRequest, servletResponse);
    }
}

客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test7

//控制台没有输出

因为请求到达不了TestServlet7处,所以压根没有输出。

多个过滤器

一个项目中,可以同时存在多个过滤器。多个过滤器也可以对同一个资源进行过滤。

过滤器执行顺序由web.xml中的过滤器映射顺序决定。

image

注解配置Filter

使用@WebFilter注解

栗子

@WebFilter("/Test7")
public class TestFilter7 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setAttribute("temp","过滤器可以修改请求与响应");

        //放行==传递请求和响应给服务端
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

注解如何确定过滤器执行顺序

接口实现类的类名,没错,就是这么简单粗暴。但是Java不允许使用数字作为类名

推荐用以下类名

F1_wordFilter

F数字_XXXFilter

标签:Java,请求,Filter,doFilter,第三十一,过滤器,servletRequest,FilterChain
From: https://www.cnblogs.com/Ocraft/p/17971369

相关文章

  • RabbitMQ学习四 java客户端连接RabbitMQ
    RabbitMQ的工作模式,可以参考官网:https://www.rabbitmq.com/getstarted.html一、简单方式以下两种都是生产者直接发消息给队列,不通过交换机。且发送给队列的消息只能被消费一次。比如一个队列被C1和C2消费,在队列中的消息只会被一个消费者消费。生产者代码逻辑图代码如下:p......
  • github copilot 在java中使用
    如何在Java中使用GitHubCopilot引言在本文中,我将向您展示如何在Java开发中使用GitHubCopilot。GitHubCopilot是一款由GitHub开发的人工智能代码建议工具,可以帮助开发者提高代码编写速度和质量。对于刚入行的小白,学习如何使用GitHubCopilot可以极大地提升开发效率和学习曲线。......
  • stable diffusion java开发
    实现“stablediffusionjava开发”作为一名经验丰富的开发者,我将帮助你了解和实现“stablediffusionjava开发”。下面是整个过程的步骤表格:步骤操作步骤1确定项目需求和目标步骤2设计系统架构步骤3编写代码步骤4运行和测试代码步骤5调试和修复错误......
  • Java进阶1
    Struct顺序packagecom.zzl.struct;publicclassShunXuDemo1{publicstaticvoidmain(String[]args){System.out.println("hello1");System.out.println("hello2");System.out.println("hello3");......
  • javaStable Diffusion
    教你实现“javaStableDiffusion”流程及代码示例1.简介JavaStableDiffusion(JSD)是一种用于在Java应用程序中实现稳定的扩散算法的技术。它可以帮助开发者在分布式系统中实现可靠的消息传递和数据同步。本文将向你介绍JSD的实现过程,并提供相应的代码示例。2.实现流程下面是......
  • 正则表达式复习七——JavaScript 中使用
    JavaScript使用JavaScript的正则表达式是由RegExp对象表示的,同时也可以使用正则表达式字面量。1.使用RegExp对象letpattern=newRegExp("pattern","flags");pattern是字符串形式的正则表达式模式。flags是字符串形式的修饰符,可以包含i,g,m等。letpattern......
  • JAVA碎知识
    1、Java中初始化数组的方法:在Java中,可以使用以下几种方法来初始化数组:(1)静态初始化:指定数组的初始值,并在声明数组时进行初始化。语法如下:dataType[]arrayName={value1,value2,...,valueN};//示例:int[]numbers={1,2,3,4,5};String[]names={"Alice",......
  • Java异常
    Java异常一、java异常概念和分类1、Java概念异常(Exception)就是程序在运行过程中出现的一些错误,我们通过面向对象的思想,把这些错误也用类来描述,那么一旦产生一个错误,即就是创建了某一个错误的对象,这个对象就是我们所说的异常对象。以下是常见的异常:(1)IndexOutOfBoundsException:......
  • Java期末知识点总结(不全)
    Java知识点Lesson1认识javaLesson2-3认识对象:封装数据为类1.类中有成员变量(属性/字段)+成员函数(方法),类是对象的模板/缔造者/抽象/类型2.局部变量和成员变量的区别:(1)定义位置不同:定义在类中的变量成员变量,定义在方法或{}中的是局部变量(2)内存中位置不同:成员变量在堆......
  • Java基础知识整理,驼峰规则、流程控制、自增自减
    写在开头本文接着上一篇文章续写哈。[Java基础知识整理,注释、关键字、运算符](https://blog.csdn.net/qq_43506040/article/details/135633325)在这一篇文章中我们总结了包括注释、关键字、运算符的Java基础知识点,今天继续来聊一聊命名规则(驼峰)、流程控制、自增自减。一、命名......