系列四、过滤器简介

一、简介

1.1、概述

        过滤器作为JavaWEB的三大组件(Servlet程序、Filter过滤器、Listener监听器),它的主要功能是用来拦截请求的,当客户端要访问某个资源时,先来到配置好的过滤器,过滤器可以在用户访问某个资源之前或者之后做一些事情,例如:

(1)校验请求的参数是否符合逻辑,符合逻辑则放行,不符合逻辑则不允许访问方法;

(2)设置 请求/响应 的Header;

(3)修改 请求/响应 的内容;

          ......

        另外,Filter引入了过滤器链(Filter Chain)的概念,一个Web应用可以部署多个Filter,由这些Filter组成一种链式结构,共同处理客户端的请求,当客户端的请求到达Servlet之前会先在这个链上传递,不同的Filter负责处理不同的 请求/响应。

1.2、流程图

 

1.3、多个Filter的执行特点

        (1)所有的filter和目标资源默认都执行在同一个线程中;

        (2)多个filter共同执行的时候,它们使用同一个request对象;

        (3)在多个Filter执行的时候,它们的优先级顺序是按照web.xml中配置的顺序执行的,配置在上面的先执行;

1.4、 doFilter()的作用

        (1)执行下一个Filter过滤器(如果有的话);

        (2)执行目标资源(只有一个过滤器);

二、创建 & 使用过滤器

2.1、说明

        由于当前公司的日常主流技术是springboot + 微服务,所以原始的JavaWEB中的方式,我这边暂时先不演示了,等以后有时间再补充!这里主要演示在springboot中如何创建 & 使用过滤器;参考:SpringBoot 过滤器 filter 3种方法_springboot 全局filter_饼干开发的博客-CSDN博客

2.2、@WebFilter + @ServletComponentScan

2.2.1、步骤

        (1)创建一个类实现Filter接口;

        (2)类上添加@WebFilter(urlPatterns = "") 注解,在chain.doFilter()中编写拦截逻辑;

        (3)配置类上添加 @ServletComponentScan 注解,将标识了 @WebServlet、@WebFilter、@WebListener 注解的类注入到IOC容器中;

2.2.2、@WebFilter

        @WebFilter是javax包中提供的一个注解,标识在实现Filter接口的类上,表明该类是一个过滤器类,通常搭配 urlPatterns 属性一起使用,如下所示:

@WebFilter(urlPatterns = "/user/*")
@Slf4j
public class LoginFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		
	}

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
		
	}

	@Override
	public void destroy() {
		
	}

}

2.2.3、@ServletComponentScan

        @ServletComponentScan是springboot提供的一个注解,一般标识在配置类上,用于将类上标识了 @WebServlet、@WebFilter、@WebListener 注解的类注入到IOC容器中。例如:

@ServletComponentScan
@SpringBootApplication
public class SpringbootFilterApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootFilterApplication.class, args);
    }

}

2.2.4、小总结

        @WebFilter注解标识在实现Filter接口的类上,表明该类是一个过滤器类,通常搭配 urlPatterns 属性一起使用, @ServletComponentScan注解一般标识在配置类上,用于将类上标识了 @WebServlet、@WebFilter、@WebListener 注解的类注入到IOC容器中,两者搭配使用提供过滤功能,上面配置的loginFilter,当用户访问 /user/login 接口时,会先执行 LoginFilter中

的doLogin()方法,当执行chain.doFilter(request, response)后,才会真正执行 /user/login 中的业务。

2.3、FilterRegistrationBean

2.3.1、步骤

(1)编写一个类实现Filter;

@Slf4j
public class AuthorityFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		
	}

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
		
	}

	@Override
	public void destroy() {
		
	}

}

 (2)配置类中注册Filter;

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/5 1:59
 * @Description:
 *
 * 注意事项:
 *      此处也可以不写此配置,不写的话,AuthorityFilter由于加了@Component注解,也会被Spring容器管理,但是@Component注解没有路径过滤规则,
 * 即会将所有请求都过滤,配置的意义主要就是为了过滤某一类的请求,如下的配置是只有访问以 /privilege/* 打头的请求才会过滤,访问其他的则不过滤
 */
@Configuration
public class MyFilterConfig {

    @Bean
    public FilterRegistrationBean registrationBean() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new AuthorityFilter());
        registrationBean.setName("authorityFilter");
        registrationBean.addUrlPatterns("/privilege/*");
        // 值越小,优先级越高
        registrationBean.setOrder(1);

        return registrationBean;
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker架构、镜像操作和容器操作

一、docker基本管理和概念 1、概念 docker:开源的应用容器引擎。基于go语言开发的。运行在Linux系统中的开源的轻量级的“虚拟机” docker的容器技术可用在一台主机上轻松到达为任何应用创建一个轻量级到的,可移植的,自给自足的容器 dock…

基于remix+metamask+ganache的智能合约部署调用

在我们部署合约时为了让它更接近真实区块链去中心化体验,我们需要调用小狐狸(Metamask)来进行真实交易,而metamask里没有内置虚拟测试币,我们需要进行调用Ganache来添加带有虚拟测试币的账号。以上就是三者的关系&…

编程实战:类C语法的编译型脚本解释器(十)编译表达式

系列入口:编程实战:类C语法的编译型脚本解释器(九)编译语句 本文介绍表达式的编译。 一、代码概览 表达式的编译就是不断获取下一个标识符,直到遇到不属于表达式的东西。 完整代码如下: Expression* GetExp…

Java+Swing: (jframe自定义图标和居中显示) 整理1

package com.test;import javax.swing.*; import java.awt.*; import java.net.URL;/*** Author:xiexu* Date:2023/12/3 19:13*/ public class JframeTest {JFrame jFrame;JButton jButton;public JframeTest() {// 容器组件(jframe, jpanel,…

深圳冬季穿搭造型

深圳冬季穿搭造型 今天是2023年11月17日,北方在11月初就降下了大雪,那是我的老家,无比怀念。 而在深圳,冬天是体会不到那份冷冽的寒冷的,所以在深圳,每天的晚上,我都会出去散步,昨…

Kubernetes Service控制器详解以及切换为ipvs代理模式

文章目录 一、Service 存在的意义二、Pod与Service的关系三、Service定义与创建四、Service三种常用类型五、Service代理模式六、切换Service代理模式七、service总体工作流程八、kube-proxy ipvs和iptables的异同九、Service DNS名称 一、Service 存在的意义 service的引入主…

推荐10款App安全测试工具

移动互联网时代,我们的生活和工作深受 App 影响。伴随移动 App 的广泛应用,App 安全日益重要。本文介绍了 App 开发可能用到的安全测试工具。 当今, 全球移动用户大约超过37亿。 Google Play 上大约有 220 万个 App, 苹果App Sto…

二极管是什么

二极管 电子元器件百科 文章目录 二极管前言一、二极管是什么二、二极管的类别三、二极管的应用实例四、二极管的作用原理总结前言 二极管是一种重要的电子器件,通过其整流行为和管理方向的特性,可以在电路中实现电流控制和电压整流等功能。 一、二极管是什么 二极管是一种…

idea__SpringBoot微服务03——yaml(新注解)(新的依赖)

yaml 一、数据格式二、注入配置文件(yaml注入)(新注解ConfigurationProperties)三、注入配置文件(properties注入)(新注解PropertySource)四、yaml配置文件占位符${}五 、yaml跟prop…

【虚拟机】Docker基础 【二】【数据卷和挂载本地目录】

2.2.数据卷 容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题: 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了&#x…

智能优化算法应用:基于蜜獾算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于蜜獾算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于蜜獾算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜜獾算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

深入理解 new 操作符:创建对象的秘密武器(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

SQL Server 数据库,创建触发器避免数据被更改

5.4触发器 触发器是一种特殊类型的存储过程,当表中的数据发生更新时将自动调用,以响应INSERT、 UPDATE 或DELETE 语句。 5.4.1什么是触发器 1.触发器的概念 触发器是在对表进行插入、更新或删除操作时自动执行的存储过程,触发器通常用于强…

Elastcsearch:通过 Serverless 提供更多服务

作者:Ken Exner 人们使用 Elasticsearch 解决最大数据挑战的方式一直令我们感到惊讶。 从超过 40 亿次下载、70,000 次提交、1,800 名贡献者以及我们全球社区的反馈中可以清楚地看出这一点。 Elastic 在广泛的用例中发挥的作用促使我们简化复杂性,让搜索…

9.基于SpringBoot3+I18N实现国际化

1. 新建资源文件 在resources目录下新建目录i18n, 然后 新建messages_en.properties文件 user.login.erroraccount or password error!新建messages_zh_CN.properties文件 user.login.error帐户或密码错误!2. 新建LocaleConfig.java文件 Configurati…

gpt3、gpt2与gpt1区别

参考:深度学习:GPT1、GPT2、GPT-3_HanZee的博客-CSDN博客 Zero-shot Learning / One-shot Learning-CSDN博客 Zero-shot(零次学习)简介-CSDN博客 GPT-2 模型由多层单向transformer的解码器部分构成,本质上是自回归模型…

Hazelcast分布式内存网格(IMDG)基本使用,使用Hazelcast做分布式内存缓存

文章目录 一、Hazelcast简介1、Hazelcast概述2、Hazelcast之IMDG3、数据分区 二、Hazelcast配置1、maven坐标2、集群搭建(1)组播自动搭建 3、客户端4、集群分组5、其他配置 三、Hazelcast分布式数据结构1、IMap2、IQueue:队列3、MultiMap4、I…

MySQL和MongoDB简介以及它们之间的区别

本文主要介绍MySQL和MongoDB的简介以及它们之间的区别。 目录 MySQL简介MySQL的优缺点MySQL的应用场景MongoDB简介MongoDB的优缺点MongoDB的应用场景MySQL和MongoDB的区别 MySQL简介 MySQL是一种开源的关系型数据库管理系统,是世界上最流行的数据库之一。它支持多用…

基于Java SSM框架实现弹幕视频网站系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现弹幕视频网站系统演示 摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,弹幕视频网站当然也不能排除在外。弹幕视频网站是以实际运用为开发背景&…

语义分割网络FCN

语义分割是一种像素级的分类,输出是与输入图像大小相同的分割图,输出图像的每个像素对应输入图像每个像素的类别,每一个像素点的灰度值都是代表当前像素点属于该类的概率。 语义分割任务需要解决的是如何把定位和分类这两个问题一起解决&…