拦截器和过滤器的区别是什么

article/2025/10/7 17:04:55

过滤器

过滤器Filter是基于Servlet实现。Servlet的工作原理是拦截配置好的客户端请求,然后对RequestResponse进行处理。Filter过滤器随着web应用的启动而启动,只初始化一次。

过滤器的配置比较简单,直接实现Filter 接口就可以了,也可以通过@WebFilter注解实现对特定URL拦截,Filter 接口中定义了三个方法:init()、doFilter()以及destroy()。

  • init() :该方法在容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。注意:这个方法必须执行成功,否则过滤器会不起作用。

  • doFilter() :容器中的每一次请求都会调用该方法, FilterChain 用来调用下一个过滤器 Filter。

  • destroy(): 当容器销毁 过滤器实例时调用该方法,一般在方法中销毁或关闭资源,在过滤器 Filter 的整个生命周期也只会被调用一次。

下面是的代码的实现方式:

package com.redis.test.filter;import org.springframework.stereotype.Component;import javax.servlet.*;
import java.io.IOException;/*** @Author: laz* @CreateTime: 2023-03-01  17:21* @Version: 1.0*/
@Component
public class TestFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.err.println("过滤器前置");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.err.println("过滤器处理中");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {System.err.println("过滤器销毁");}
}

写一个测试类:

package com.redis.test.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Author: laz* @CreateTime: 2023-03-01  09:39* @Version: 1.0*/
@RestController
@RequestMapping("test")
public class TestController {@RequestMapping("filter")public void test(){System.err.println("controller逻辑代码");}
}

启动项目,执行此接口,然后查看控制台:

在这里插入图片描述
通过控制台输出日志可以看到:init()方法在容器启动初始化过滤器时被调用,doFilter()方法在请求接口的时候被调用,destroy()方法在容器销毁的时候才会被调用,一般看不到。

拦截器

拦截器是SpringMVC中实现的一种基于Java反射(动态代理)机制的方法增强工具,拦截器的实现方式是是实现HandlerInterceptor 接口,HandlerInterceptor接口里面也有三个方法:preHandle()postHandle()afterCompletion()

  • preHandle() :这个方法将在请求处理之前进行调用。注意:如果该方法的返回值为false ,将视为当前请求结束,不仅自身的拦截器会失效,还会导致其他的拦截器也不再执行。

  • postHandle():只有在 preHandle() 方法返回值为true 时才会执行。会在Controller中的方法调用之后,DispatcherServlet 返回渲染视图之前被调用。 有意思的是:postHandle() 方法被调用的顺序跟 preHandle() 是相反的,先声明的拦截器 preHandle() 方法先执行,而postHandle()方法反而会后执行。

  • afterCompletion():只有在 preHandle() 方法返回值为true 时才会执行。在整个请求结束之后, DispatcherServlet 渲染了对应的视图之后执行。

下面是的代码的实现方式:
先实现HandlerInterceptor接口并重写里面的三个方法:

package com.redis.test.interceptor;import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @Author: laz* @CreateTime: 2023-03-01  17:14* @Version: 1.0*/
@Component
public class TestInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.err.println("拦截器前置");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {System.err.println("拦截器处理中");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {System.err.println("拦截器后置");}}

然后写一个配置类,将我们定义好的拦截器进行注册:

package com.redis.test.config;import com.redis.test.interceptor.TestInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @Author: laz* @CreateTime: 2023-03-01  17:17* @Version: 1.0*/
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate TestInterceptor testInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {/*** addInterceptor(testInterceptor)将我们定义的拦截器进行注册* addPathPatterns("/**")表示对所有请求进行拦截* excludePathPatterns("/login")表示对某些请求放行,不需要拦截*/registry.addInterceptor(testInterceptor).addPathPatterns("/**").excludePathPatterns("/login");}
}

启动项目,再次调用我们上面的接口:

在这里插入图片描述

通过日志可以看到:preHandle()方法在请求处理前被调用,postHandle()方法在controller请求结束后被调用,而afterCompletion()方法是在整个请求结束后才被调用。

过滤器和拦截器的区别

从上面输出日志可以看到,过滤器是在拦截器之前被调用,下面提供两张过滤器与拦截器执行顺序图:

在这里插入图片描述

由图可知:过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后,过滤器属于Servlet级别。

拦截器Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束,拦截器属于Spring级别。

在这里插入图片描述

拦截器与过滤器执行顺序即:

过滤器前置->过滤器处理中->拦截器前置->拦截器处理中->拦截器后置->过滤器后置

在日常实际开发中拦截器的应用场景会比过滤器要更多,一般情况下他们的使用场景如下:

  • 拦截器:权限控制,日志打印,参数校验

  • 过滤器:跨域问题解决,编码转换

总结

拦截器和过滤器的区别主要有一下几点:

  1. 实现原理不同:过滤器拦截器 底层实现方式大不相同,过滤器 是基于函数回调的,拦截器 则是基于Java的反射机制(动态代理)实现的。
  2. 使用范围不同: 过滤器 实现的是 javax.servlet.Filter 接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。而拦截器它是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application等程序中。
  3. 触发时机不同: 由上图可知,过滤器优先于拦截器执行。
  4. 拦截的请求范围不同: 过滤器几乎可以对所有进入容器的请求起作用,而拦截器只会对Controller中请求或访问static目录下的资源请求起作用。

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

相关文章

Spring拦截器和过滤器的区别

本文来说下Spring拦截器和过滤器的区别 文章目录 概述拦截器和过滤器介绍过滤器 (Filter)拦截器 (Interceptor)主要区别 拦截器和过滤器的区别实现原理不同使用范围不同触发时机不同拦截的请求范围不同注入Bean情况不同控制执行顺序不同 本文小结 概述 拦截器和过滤器 filter和…

springboot拦截器和过滤器的区别与使用

拦截器与过滤器的区别 spring的拦截器与servlet的filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等,不同的是: 适用范围不同:filter是servlet规范规定的,只能用于web程序中…

Springboot--拦截器、过滤器 区别,作用,实现方法

Springboot–拦截器、过滤器 拦截器和过滤器的区别 拦截器不依赖于servlet容器,这是springMVC自带的,过滤器依赖于servlet容器拦截器是基于java的反射机制,过滤器是基于函数的回调拦截器只能对action请求起作用,而过滤器可以对几…

Spring Boot拦截器与过滤器的区别

Spring Boot拦截器与过滤器的区别 在使用Spring Boot开发Web应用程序时,您可能需要在处理请求之前或之后执行某些操作。这些操作可以包括身份验证、日志记录、性能监测等。在这种情况下,您可以使用两种不同的机制:拦截器和过滤器。本文将介绍…

Springboot过滤器和拦截器的区别

上两篇文章我们介绍了过滤器Filter和拦截器Intercepter,其功能都是对请求进行拦截并对请求过滤,本篇文章就介绍一下两者的区别 1. 过滤器和拦截器的区别 过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入serv…

关于拦截器与过滤器使用场景、拦截器与过滤器的区别整理

拦截器与过滤器的区别总结&#xff1a; 过滤器在web.xml中配置&#xff1a; &#xff08;1&#xff09;因为一开始在过滤器中映射的url-pattern填写路径是*.action。所有的action要经过它的过滤。<url-pattern>*.action</url-pattern> &#xff08;2&#xff09;…

彻底搞清拦截器和过滤器的区别

一、引言 本来想记录一下关于用户登陆和登陆之后的权限管理、菜单管理的问题&#xff0c;想到解决这个问题用到Interceptor&#xff0c;但想到了Interceptor&#xff0c;就想到了Filter&#xff0c;于是就想说一下它们的执行顺序和区别。关于Interceptor解决权限和菜单管理的问…

Spring拦截器和过滤器的区别及详解

拦截器和filter的功能都是拦截&#xff0c;filter是在servlet前执行的&#xff0c;拦截器拦截的是Spring MVC定义的概念。过滤器中包含拦截器&#xff0c;发送一个请求&#xff0c;先进行过滤器处理&#xff0c;看程序是否受理该请求。过滤器放过后&#xff0c;程序中的拦截器再…

拦截器与过滤器的区别

文章目录 一、二者理解过滤器&#xff08;Filter&#xff09;拦截器&#xff08;Interceptor&#xff09; 二、拦截器与过滤器的区别区别&#xff1a; 三、拦截器与过滤器的触发时机拦截器与过滤器触发时机不一样 四、使用场景五、图解 一、二者理解 过滤器&#xff08;Filter…

拦截器和过滤器的区别

1、实现原理不同 过滤器和拦截器底层实现方式大不相同&#xff0c;过滤器 是基于函数回调的&#xff0c;拦截器 则是基于Java的反射机制&#xff08;动态代理&#xff09;实现的。 2、使用范围不同 我们看到过滤器 实现的是 javax.servlet.Filter 接口&#xff0c;而这个接口是…

过滤器 和 拦截器的 6个区别,别再傻傻分不清了

周末有个小伙伴加我微信&#xff0c;向我请教了一个问题&#xff1a;老哥&#xff0c;过滤器 (Filter) 和 拦截器 (Interceptor) 有啥区别啊&#xff1f; 听到题目我的第一感觉就是&#xff1a;简单&#xff01; 毕竟这两种工具开发中用到的频率都相当高&#xff0c;应用起来也…

过滤器和拦截器的区别

文章目录 一、拦截器和过滤器的区别1、过滤器1、实现方式2、应用场景 2、拦截器1、实现方式2、应用场景 总结 一、拦截器和过滤器的区别 1、过滤器和拦截器触发时机不一样&#xff0c;过滤器是在请求进入容器后&#xff0c;但请求进入servlet之前进行预处理的。请求结束返回也…

过滤器和拦截器有什么区别?

过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;都是基于 AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;思想实现的&#xff0c;用来解决项目中某一类问题的两种“工具”&#xff0c;但二者有着明显的差…

面试篇-Spring 拦截器和过滤器的区别?

1、实现原理不同 过滤器和拦截器 底层实现方式大不相同&#xff0c;过滤器 是基于函数回调的&#xff0c;拦截器 则是基于Java的反射机制&#xff08;动态代理&#xff09;实现的。 2、使用范围不同 我们看到过滤器 实现的是 javax.servlet.Filter 接口&#xff0c;而这个接…

Nessus在线更新教程

前言&#xff1a;在线更新Nessus需要科学上网&#xff0c;没有工具无法更新。 1. 设置更新策略 这里选&#xff1a;更新所有的组件、频率选&#xff1a;每天&#xff0c;就可以 2. 检查是否有更新 3. 打开梯子&#xff0c;将梯子设置为全局模式 4. cmd命令行&#xff0c;进…

弱点扫描工具NESSUS详细教程

NESSUS • 家庭版 • 免费 • 专业版 • 收费、无限的并发连接 • 下载 • http://www.tenable.com/products/nessus/select-your-operating-system • 安装 • dpkg -i • 安装路径:/opt/nessus • 启动服务 • systemctl start nessusd.service • 管理地址 • https://12…

NESSUS使用笔记

Nessus 使用记录 启动nessus服务Nessus更新插件教程win10升级&#xff08;破解&#xff09;方法kali 进行升级(初始化完成后之后发现还是无法破解成功&#xff0c;看来kali系统无法使用这种方式进行破解了) 启动nessus服务 进入kali系统&#xff0c;终端输入如下命令&#xff…

Nessus学习

攻击主机&#xff1a; Kali 192.168.11.106 靶机&#xff1a;windows server 2008 r2 192.168.11.134 x64 32位 nessus 实验原理&#xff1a; 利用漏洞扫描器能够自动应用漏洞扫描原理&#xff0c;对目标主机安全漏洞进行检测&#xff0c;附带识别主机漏洞的特征库的功能&…

Nessus安全测试工具使用教程

Nessus安全测试工具使用教程 1.创建 New Scan扫描按钮 2.选择扫描策略 3.创建扫描成功 4.扫描结果

Nessus部署及简单使用

01 Nessus 简介 Nessus 是目前全世界最多人使用的系统漏洞扫描与分析软件。总共有超过75,000个机构使用 Nessus 作为扫描该机构电脑系统的软件。Nessus号称是世界上最流行的漏洞扫描程序,通常包括成千上万的最新的漏洞&#xff0c;各种各样的扫描选项&#xff0c;及易于使用的…