[Spring]过滤器

news/2024/9/22 14:31:31/文章来源:https://www.cnblogs.com/DCFV/p/18425226

image

过滤器Filter作为Java三大器之一,在Java Web的使用中有很高的地位。所谓过滤器,就是实现了javax.servlet.Filter接口的服务器端程序。
Filter有如下几个用处:

  • 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
  • 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
  • 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
  • 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

Filter有如下几个方法:

  • void init(FilterConfig filterConfig) 用于完成过滤器的初始化。
  • void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) 实现过滤功能,该方法对每个请求增加额外的处理。
  • void destroy() 用于过滤器销毁前,完成某些资源的回收。

通过@WebFilter实现

通过@WebFilter和@ServletComponentScan可实现Filter。其中,@WebFilter标注在实现Filter接口的过滤器类,并标注相应参数;@ServletComponentScan标注在SpringBoot启动类,标注后Servlet、Filter(过滤器)、Listener(监听器)可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码!

具体示例代码如下:

TestFilter.java

package com.example.demo.filter;import org.springframework.core.annotation.Order;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;/*** @description:* @time: 2021/8/3 16:12*/
@WebFilter(initParams = {@WebInitParam(name="testFilter",value = "/test")})
@Order(1)
public class TestFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);System.out.println("-----Filter初始化完成-----");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {System.out.println("-----调用服务前执行代码-----");filterChain.doFilter(servletRequest,servletResponse);System.out.println("-----调用服务后执行代码-----");}@Overridepublic void destroy() {Filter.super.destroy();System.out.println("Filter已销毁");}
}

TestController.java

package com.example.demo.controller;import com.example.demo.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;/*** @description:* @time: 2021/8/3 16:04*/
@RestController
public class TestController {@AutowiredTestService testService;@RequestMapping(value = "/test",method = RequestMethod.GET)public Object test(){testService.printTest();return "test";}}

Demo1Application.java

package com.example.demo;@SpringBootApplication
@ServletComponentScan
public class Demo1Application {public static void main(String[] args) {SpringApplication.run(Demo1Application.class, args);}
}

运行结果如下:

通过@Bean实现
此处为了测试@order的效果,使用了两个过滤器测试。

WebConfig.java

package com.example.demo.config;import com.example.demo.filter.FirstFilter;
import com.example.demo.filter.SecondFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.servlet.Filter;/*** @description:* @time: 2021/8/4 10:11*/
@Configuration
public class WebConfig {@Beanpublic FilterRegistrationBean firstFilterRegistrationBean(){FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();filterFilterRegistrationBean.addUrlPatterns("/hello");// 设置优先级filterFilterRegistrationBean.setOrder(1);// 绑定过滤器FirstFilter filter = new FirstFilter();filterFilterRegistrationBean.setFilter(filter);return filterFilterRegistrationBean;}@Beanpublic FilterRegistrationBean secondFilterRegistrationBean(){FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();filterFilterRegistrationBean.addUrlPatterns("/hello");// 设置优先级filterFilterRegistrationBean.setOrder(2);// 绑定过滤器SecondFilter filter = new SecondFilter();filterFilterRegistrationBean.setFilter(filter);return filterFilterRegistrationBean;}
}

FirstFilter.java

package com.example.demo.filter;import javax.servlet.*;
import java.io.IOException;/*** @description:* @time: 2021/8/4 10:09*/
public class FirstFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);System.out.println("-----FirstFilter初始化完成-----");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {System.out.println("-----服务前执行代码FirstFilter-----");filterChain.doFilter(servletRequest,servletResponse);System.out.println("-----服务后执行代码FirstFilter-----");}@Overridepublic void destroy() {Filter.super.destroy();System.out.println("FirstFilter已销毁");}
}

SecondFilter.java

package com.example.demo.filter;import javax.servlet.*;
import java.io.IOException;/*** @description:* @time: 2021/8/4 10:30*/
public class SecondFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);System.out.println("-----SecondFilter初始化完成-----");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {System.out.println("-----服务前执行代码SecondFilter-----");filterChain.doFilter(servletRequest,servletResponse);System.out.println("-----服务后执行代码SecondFilter-----");}@Overridepublic void destroy() {Filter.super.destroy();System.out.println("SecondFilter已销毁");}
}

执行效果如下:

通过结果可见,filter的初始化服务时在启动Spring Boot项目的时候就已经完成。而当用户访问服务时,执行的顺序按照order的优先级(数字越小越优先)执行。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 GitHub Actions Pages 托管 Honkit 发布的网站

使用 GitHub Actions & Pages 托管 Honkit 发布的网站 Created: 2024-09-22T13:48+08:00 Published: 2024-09-22T14:28+08:00 Category: DevOps 作为张雨生的骨灰级粉丝,我一直想把雨生的资料尽可能地收集起来,用网站或者电子书的形式发布。 一番查找后,我选择了 honkit…

MySQL 用户与权限 C连接与使用

目录用户用户管理查询所有用户查看当前用户查看当前连接数创建用户删除用户修改密码规则查看规则/策略规则说明临时设置持久设置修改密码权限数据库提供的 权限列表查看权限给用户授权回收用户权限使用C语言连接库的安装C APImysql_initmysql_real_connectmysql_closemysql_que…

如果防止feign的超时调用造成多次扣减库存

问题:订单服务在通过feign调用库存服务进行库存扣减的时候,我们知道feign是有超时重试机制的。当出现feign超时,或者网络抖动的时候,订单服务以为上次调用没有成功,即使实际上调用成功了,还是会再次调用。库存服务无法区分是否为同一个操作,导致 相同操作被…

[Spring]拦截器

Interceptor 介绍拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。 你可以使用 Interceptor 来执行某些任务,例如在 Controller 处理请求之前编写日志,添加或更新配置...... 在 Spring中,当请求发送…

win10x64位+nmake编译geos3.7.1

说明:使用nmake进行编译,最新的geos3.13似乎已经不能用nmake进行编译了,不过3.7.1已经够用了。 1、 解压geos-3.7.1,定位到根目录下的namke.opt文件,这个文件控制着nmake编译的一些参数。 2、 打开nmake.opt,找到如下片段: ###########################################…

Nuxt Kit API :路径解析工具

title: Nuxt Kit API :路径解析工具 date: 2024/9/22 updated: 2024/9/22 author: cmdragon excerpt: 摘要:本文介绍了Nuxt Kit中用于解析路径的API工具,包括resolvePath、resolveAlias、findPath和createResolver。这些工具助力开发者处理模块路径、别名、文件扩展名,提…

使用GPU 加速 Polars:高效解决大规模数据问题

Polars 最近新开发了一个可以支持 GPU 加速计算的执行引擎。这个引擎可以对超过 100GB 的数据进行交互式操作能。本文将详细讨论 Polars 中DF的概念、GPU 加速如何与 Polars DF协同工作,以及使用新的 CUDA 驱动执行引擎可能带来的性能提升。 https://avoid.overfit.cn/post/b…

我的网站集成ElasticSearch初体验

最近,我给我的网站(https://www.xiandanplay.com/)尝试集成了一下es来实现我的一个搜索功能,因为这个是我第一次了解运用elastic,所以如果有不对的地方,大家可以指出来,话不多说,先看看我的一个大致流程 这里我采用的sdk的版本是Elastic.Clients.Elasticsearch, Ver…

Flipper Zero极客的便携式多功能工具设备

官网:Flipper Zero — 极客的便携式多功能工具设备 Flipper Zero是近两年比较热门的硬件工具,官方固件主要涵盖的功能为Sub-Ghz,125kHz,NFC,红外。 基本信息资料都可以在官方网站找到比较详细的文档解释。本篇主要是一个基础入门,这系列也是给自己学习此硬件一个上手研究…

C盘扩容免费工具

1.diskgenius 下载 https://www.diskgenius.cn/download.php 解压即可使用,无需安装 2.下载 安装Windows_PE环境 https://www.diskgenius.cn/help/windows_aik_adk_installnotes.php?Version=0A000000&Build=22631&Lang=936 官方软件,安全五毒 3.运行diskgenius ,点…

Leetcode 2464. 有效分割中的最少子数组数目

1.题目基本信息 1.1.题目描述 给定一个整数数组 nums。 如果要将整数数组 nums 拆分为 子数组 后是 有效的,则必须满足: 每个子数组的第一个和最后一个元素的最大公约数 大于 1,且 nums 的每个元素只属于一个子数组。 返回 nums 的 有效 子数组拆分中的 最少 子数组数目。如果…

debian 系统服务器搭建

在VMWare中安装Debian12.5虚拟机后, 需要开始进行一些设置:1. 先设置网络模式为桥接模式, 这样和主机在同一个局域网,方便后续ssh连接 2. 第1步设置后,重启Debian,登录后, 查看IP和Mac地址, 192.168.31.16,00:0c:29:6c:31:e6 3. 设置路由器,固定IP: 192.168.31.105。 …