过滤器、拦截器入门,看这一篇就够了

Pydoll浏览器自动化框架教程 让浏览器自动化回归本质。不再纠缠驱动兼容、不再手动处理验证码、不再因为请求和 UI 分裂而头疼。如果你经常做 Web 自动化、爬虫或者测试,不妨试试 Pydoll。也别忘了给项目点个 ⭐,让作者知道有人喜欢这个工具。👉GitHub 地址。 阅读详情

实际项目开发过程中,肯定有这样的需求:

  1. 记录每个rest请求耗费的时间,入参,出参
  2. 某些请求需要判断是否有权限,某些请求是不需要权限也可以运行的

这个需求太普遍了。今天我们就一起来学习这个需求的两种实现方式:

  1. 拦截器
  2. 过滤器
拦截器

话不多说,咱们上代码,新建日志拦截器:

@Component
public class LogInterceptor implements HandlerInterceptor {
    //在请求rest接口之前调用
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("请求url:"+request.getRequestURL());
        Map<String, String[]> parameterMap = request.getParameterMap();
        Enumeration<String> parameterNames = request.getParameterNames();

        System.out.println("请求参数:");
        while (parameterNames.hasMoreElements()) {
            String name = (String) parameterNames.nextElement();
            String value = request.getParameter(name);
            System.out.println(name+"==>"+value);
        }

        //假设参数a传递的如果是1的话,是不合法的请求,不继续往下执行
        if("1".equals(request.getParameter("a"))){
            return false;
        }
        return true;//如果返回false则不会继续往下执行,不会真正的进入到controller
    }

    //请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle is called...");
    }

    //在整个请求结束之后被调用
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion is called...");
    }
}

在WebMvcConfigurer中注册该拦截器,并告诉spring哪些路径需要拦截,哪些路径不需要拦截

@Configuration
public class InterceperConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加拦截器
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(new LogInterceptor() {
        });
        //如下的路径不拦截,多个路径用逗号分隔
        interceptorRegistration.excludePathPatterns("/demo/test2");
        //拦截如下路径
        interceptorRegistration.addPathPatterns("/**");
    }
}

好了,拦截器就做完了,so easy。下面我们写个controller来测试下吧!

@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("test1")
    public String test1(){
        System.out.println("rest.test1 is called");
        return "test1";
    }

    @GetMapping("test2")
    public String test2(){
        System.out.println("rest.test2 is called");
        return "test2";
    }

    @GetMapping("test3")
    public String test3(@RequestParam("a")String a){
        System.out.println("rest.test3 is called");
        return "test3";
    }
}

测试的结果基本可以预期到

  1. demo/test1 和 demo/test3会被拦截,进拦截器
  2. demo/test2 不会进拦截器
  3. demo/test3?a=1 这个请求会进拦截器,但是进不了controller。
过滤器
@WebFilter(urlPatterns = "/*", filterName = "LogFilter")
public class LogFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("logfilter.init is called...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter中打印的请求参数:");
        Enumeration<String> parameterNames = servletRequest.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String key = parameterNames.nextElement();
            String value = servletRequest.getParameter(key);
            System.out.println(key+"==>"+value);
        }

        long bgn = System.currentTimeMillis();
        //一定要调用链式调用传递,否则也进不了controller
        filterChain.doFilter(servletRequest,servletResponse);
        long end = System.currentTimeMillis();
        System.out.println("filter中记录耗时:"+(end-bgn)+"ms");
    }

    @Override
    public void destroy() {
        System.out.println("logfilter.destroy is called...");
    }
}

注意:@WebFilter这个注解是Servlet3.0的规范,并不是Spring boot提供的。除了这个注解以外,我们还需在配置类中加另外一个注解:@ServletComponetScan,指定扫描的包。

总结

拦截器、过滤器执行顺序,默认先执行过滤器,再执行拦截器。

如果过滤器有多个会根据过滤器的名词按照A-Z的排序先后执行。这是因为@WebFilter这个注解不支持执行顺序。当然你也可以通过写一个配置文件解决。

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean reqResFilter1() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        LogFilter logFilter = new LogFilter();
        filterRegistrationBean.setFilter(logFilter);
        filterRegistrationBean.addUrlPatterns("/demo/test1","/demo/test3");//配置过滤规则
        filterRegistrationBean.addInitParameter("name","spingboot");//设置init参数
        filterRegistrationBean.setName("logFilter");//设置过滤器名称
        filterRegistrationBean.setOrder(2);//执行次序

        return filterRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean reqResFilter() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        Log1Filter log1Filter = new Log1Filter();
        filterRegistrationBean.setFilter(log1Filter);
        filterRegistrationBean.addUrlPatterns("*");//配置过滤规则
        filterRegistrationBean.setName("Log1Filter");//设置过滤器名称
        filterRegistrationBean.setOrder(1);//执行次序
        
        return filterRegistrationBean;
    }
}

更多java原创阅读:https://javawu.com/

【Ubuntu】RK3576 Linux 6.10 Ubuntu 22.04 系统中 HUSB311 Type-C 转 DP 显示输出与 Device/OTG 模式切换配置详解 本文详细介绍了在Rockchip RK3576开发板(Linux Kernel 6.10+Ubuntu 22.04)上配置HUSB311 Type-C控制器的设备树实现方案。主要内容包括:1)硬件连接与模块组成;2)设备树完整配置,涵盖Type-C供电、USB OTG/Host模式、DP显示输出等关键功能;3)软件配置步骤与常见问题排查方法。该方案实现了Type-C接口的DisplayPort AltMode显示输出、USB Device/Host模式自动切换等功能,为嵌入式系统Type-C接口开发提供参考 阅读详情

相关推荐

使用 arxiv-sanity 实时跟进自己研究领域的Paper

介绍 arxiv.org是一个非常大的预印本资源库,里面有大量的最新的论文,但缺点是浏览、搜索和排序不是很方便。这个资源库每天会更新大量的论文,如果通过手动搜索和浏览则效率很低,高引用的好文章难以及时的找到并阅读,造成时间的浪费。因此 使用 ...

John's Blogs 8280

SpringBoot配置拦截器

拦截器的配置多用于判断用户是否登陆,如果没有登陆就拦截,若登陆了就给予放行 这里我们用登陆拦截来做例子: 首先是编写自己的拦截器,必须要实现HandlerInterceptor 接口 /** * 登录拦截器 */ @Component public class LoginInterceptor implements HandlerInterceptor { // 注入redis @Autowired private RedisTemplate redisTemplate

九离的博客 922

告别复杂配置!5分钟在Vue/React项目中集成讯飞语音听写WebSocket API

本文详细介绍了如何在Vue/React项目中快速集成讯飞语音听写WebSocket API,实现高效语音识别功能。通过对比不同通信方案,突出WebSocket在实时语音交互中的优势,并提供框架适配、音频处理及性能优化等关键技术点,帮助开发者5分钟内完成专业级语音听写功能集成。

weixin_28730353的博客 274

拦截器中addInterceptor和excludePathPatterns里的/* /**是什么

/** /**匹配/后面所有资源,包括/ a/**会匹配/a/下的所有路径 /* /*匹配一级路径,即a/的后面不能再有别的/,只能是a/x,a/xx,a/xxx,不能是a/x/xx a/* 仅可匹配一级路径如a/b、a/c不能匹配a/b/c和更多级路径 ...

z2431435的博客 2795

5090D显卡安装LLaMA-Factory避坑指南:PyTorch与CUDA版本兼容性问题解决

本文是针对5090D显卡安装LLaMA-Factory时遇到的PyTorch与CUDA版本兼容性问题的详细解决指南。文章深入剖析了因GPU架构代际差异导致的“no kernel image”报错根源,并提供了从环境诊断、安装匹配的PyTorch Nightly版本,到最终集成验证的完整路径,帮助用户确保LLaMA-Factory在5090D上稳定运行。

Apple的专栏 870

保姆级教程:在Windows上用VS2019和OpenCV4.6搞定海康MV-EB435i RGBD相机图像采集

本文提供了一份详细的教程,指导如何在Windows环境下使用VS2019和OpenCV4.6配置海康MV-EB435i RGBD相机进行图像采集。从开发环境准备、SDK部署到代码移植和优化,涵盖了深度图与RGB图同步采集的实战技巧,帮助开发者快速上手工业级RGBD相机的应用开发。

weixin_28675557的博客 468

springboot 拦截器 interceptorRegistration excludePathPatterns的url该怎么写?

这里不用管context-path,和controller那里的url保持一致即可。在applicaiton.yml中配置了context-path。

qq_43539664的博客 920

BRep实战指南:从理论到文件格式的全面解析

本文全面解析BRep(边界表示法)从基础概念到文件格式的实战应用。详细介绍了BRep的数学定义、工业应用场景,以及STEP、IGES等主流文件格式的对比与使用技巧,帮助读者掌握三维建模核心技术并优化性能。

weixin_29235923的博客 410

SpringBoot2.0学习笔记:(八) Spring Boot中拦截器的使用

一、使用方法 对于在Spring Boot2.0中使用拦截器来说,其使用方法与Spring Boot1.0并无很大区别 。 我的需求是实现登录拦截,通过在session中判断有没有登录用户名来实现拦截 首先就是建立一个实现了HandlerInterceptor的拦截器类。 如下: public class LoginInterceptor implements HandlerInterceptor...

第二庄 3737

搭建问答系统

数据描述 import docx import jieba from gensim.models import Word2Vec import os import numpy as np import pickle as pk import warnings from copy import deepcopy warnings.filterwarnings("ignore") from mu...

微信号:RunsenLiu 1842

基于STM32L4XX、HAL库的RTL8211FSI-CG以太网收发器(PHY)驱动程序设计

一、简介:RTL8211FSI-CG是Realtek公司生产的一款高性能、低功耗的单端口10/100M以太网收发器(PHY)。它通过RMII(Reduced Media Independent Interface)或MII接口与MAC控制器连接。

zhusl6688的博客 533

springboot配置拦截器

如下代码即可完成 @Configuration public class LoginConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { InterceptorRegistration interceptorRegistration = registry.addInterceptor(new AdminInter

z19799100的博客 567

【23】OpenCV C++实战篇——张正友相机标定【相机标定原理、相机标定流程、标定结果评价、图像畸变矫正】

R是3×3的正交单位矩阵(即旋转矩阵),t为平移向量,R、t与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsicparameter),可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。R是3×3的正交单位矩阵(即旋转矩阵),t为平移向量,R、t与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsicparameter),可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 4479

拦截器与过滤器的区别

文章目录一、二者理解过滤器(Filter)拦截器(Interceptor)二、拦截器与过滤器的区别区别:三、拦截器与过滤器的触发时机拦截器与过滤器触发时机不一样四、使用场景五、图解 一、二者理解 过滤器(Filter) 过滤器,是在java web中将你传入的request、response提前过滤掉一些信息,或者提前设置一些参数。然后再传入Servlet或Struts2的 action进行业务逻...

Tang 4万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

过滤器和拦截器总结

如何开发一个拦截器和过滤器,拦截器和过滤器区别

dhklsl的专栏 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

过滤器和拦截器的区别

一、拦截器和过滤器的区别 1、拦截器(Interceptor)只对action请求起作用 即对外访问路径 而过滤器(Filter)则可以对几乎所有的请求都能起作用 包括css js等资源文件 2、拦截器(Interceptor)是在Servlet和Controller控制器之间执行 而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行 在请求结束返回时也是一样 是在Servlet处理完之后返回给前端之间执行 二、拦截器和过滤器的代码实现 1、拦截器 首先需要一个拦

qq_42924666的博客 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【SpringBoot篇】Interceptor拦截器 | 拦截器和过滤器的区别

拦截器的工作方式是通过将其注册到应用程序的处理管道中,并在请求或响应传递过程中执行相应的操作。拦截器可以在整个应用程序中使用,用于执行跨越多个层的通用任务,如身份验证、授权、缓存、日志记录、性能计量等。例如,在Spring框架中,可以使用拦截器来实现身份验证和授权检查,记录请求和响应的日志,以及处理全局异常等。总之,拦截器是一种非常有用的设计模式,可以帮助开发人员在应用程序中实现通用的功能,提高代码的可重用性和可维护性。拦截器是一种非常有用的设计模式,它可以在应用程序处理请求或响应时对其进行拦截和修改。

小吉妙妙屋 5409

拦截器、过滤器、Aspect区别?看这一篇就够了!

通俗易懂的解释: 过滤器:像滤网一样,肯定是用来过滤东西的,比如,三个请求只放行两个。 拦截器:拦而不截,都可以过,但是要过去的东西做点操作,比如,三个请求都放行。 具体区别: 过滤器 拦截器 Aspect 关注的点 所有web请求 部分web请求 偏向于业务层面的拦截 实现原理 函数回调 JAVA反射机制(动态代理) 动态...

oneStep->next=CloserNow 3587

spring过滤器、拦截器

二者对比 过滤器是基于函数回调;拦截器是基于java的反射机制的。 过滤器依赖与servlet容器,拦截器不依赖与servlet容器(拦截器是Spring容器内的,是Spring框架支持的)。 因为Filter是Servlet规范中规定的,所有只能用于WEB中;而拦截器既可以用于WEB,也可以用于Application、Swing中。 过滤器是在请求进入tomcat容器后,但请求进入servlet之前进行预处理的;请求结束返回也是,是在servlet处理完后,返回给前端之前。 拦截器可以深入..

骑个小蜗牛的博客 2万+

拦截器、过滤器、AOP的区别和联系

写在前面 今天,和一位前辈聊了聊实习的事,关于java后端开发的几个问题,真的是被虐的很惨啊(理解和能讲明白完全就是两回事啊) 其中,最沙雕的是,我竟然单纯的以为过滤器(Filter)和 拦截器(Interceptor)是一个东西,然后前辈当场就diss我一顿 后来我回家翻了翻笔记发现我在学SpringMVC的时候是有学过拦截器的(还注明了重点两个字),还将其应用到了登录验证功能上 后来我反思了下,SSM学完后,直接做了一个书店系统(很简单的CRUD)就结束了,然后就直接SpringBoot了, 在里面是

发发的博客 6053

JAVA中的拦截器、过滤器

相关解释:拦截器依赖于页面有访问controller的操作,且属于SpringMVC体系的动态拦截调用机制,是java中AOP思想的运用。来看看源码作者的注释:其中倒数第二段话,描述其类似于过滤器,但其特点只允许使用自定义预处理,不能处理程序本身。此处可体现AOP思想。过滤器是在web.xml中配置,web.xml是应用程序上下文中的HandlerInterceptor。最后一段话,则体现了拦截器常用情况,如常见处理程序代码和授权检查。

qq_38254635的博客 1万+

java中拦截器和过滤器详解

1 过滤器和拦截器的异同 1.1 一张图表明两者之间的差异: tomcat,filter,servet,interceptor以及controller等各种容器的关系图 1.2 两者的区别: 拦截器是基于java的反射机制的,而过滤器是基于函数回调。 拦截器不依赖与servlet容是依赖于spring容器,过滤器依赖与servlet容器。 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用,可以限制用户对图片,文件以及其他资源的访问。 拦截器可以访问action请求上

yxg520s的博客 7819

过滤器和拦截器的作用区别及如何使用

属于Servlet(Server Applet)中的技术,可以通过Filter去管理处理web资源,可以对指定的一些行为进行拦截,进行例如权限控制、访问控制等。在ServletRequest到达Servlet之前,拦截客户端的ServletRequest,可以根据需要检查ServletRequest,也可以修改ServletRequest中的头和数据在ServletResponse到达客户端之前,可以拦截ServletResponse,可以根据需要检查ServletResponse,同样也可以修改。

ImNotNpe的博客 2333

【springboot】拦截器和过滤器的区别

在 Spring Boot 中,拦截器(Interceptor)和过滤器(Filter)都是用于对请求进行预处理和后处理的机制,但它们存在一些区别,适用于不同的场景。下面将详细介绍它们的区别、适用场景,并给出使用案例。

weixin_44823875的博客 1532

过滤器与拦截器

web包下创建filter在App中贴注解@ServletComponentScan 通过这个注解使springboot支持filter实现Filter接口(javax.Servlet),实现方法(init 初始化 执行一次,doFilter 每次过滤请求的时候都执行,destory 销毁 执行一次),贴注解@WebFilterdoFilter 中 过滤器是基于函数回调放行,在其之前可以写放行前的逻辑,后面可以写放行后的逻辑。

LiuShaoSheng7的博客 2037

一篇文章学会过滤器、拦截器、AOP

过滤器是Servlet中的概念,拦截器是springMVC中的概念,所以为了区分,我们通常可以说Servlet过滤器,springMVC拦截器,它们两个都是为了在请求之前做一些事,在请求完成之后做一些事,至于在开发中使用哪个,自己选择。首先AOP的中文名叫面向切面编程,在理解AOP之前我们也必须知道OOP,OOP就是我们常说的面向对象编程,AOP和OOP就是两兄弟,OOP是一个项目的主线,AOP是打辅助的,AOP的主要应用有记录日志,事务控制,权限控制等。

2401_83790413的博客 1011
上一篇: 深入理解Java的继承特性
下一篇: 干货!终于有人把设计模式的 “里式替换原则”讲清楚了
大盛玩java
博客等级 码龄5年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值