首页 > 其他分享 >拦截器和过滤器的区别

拦截器和过滤器的区别

时间:2024-03-29 19:29:16浏览次数:25  
标签:容器 拦截器 请求 区别 action 过滤器 servlet

        在平常使用中,对于某些功能的实现,可能既可以用拦截器完成,又可以用监听器完成。这样使我们对于这两个概念有一定程度上的混淆。

 拦截器和过滤器的区别

过滤器和拦截器的区别:

 ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
 ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
 ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
 ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
 ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。     ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

触发时机

有个专业词语叫触发时机

1.过滤器和拦截器触发时间和地点不一样:

  过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

总结:过滤器包裹住servlet,servlet包裹住拦截器。

如下图所示:

2.过滤器的触发时机是容器后,servlet之前,所以过滤器的doFilter(

ServletRequest request, ServletResponse response, FilterChain chain

)的入参是ServletRequest ,而不是httpservletrequest。因为过滤器是在httpservlet之前。

3.SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。

4.还有,拦截器是spring容器的,是spring支持的

总结:拦截器功在对请求权限鉴定方面确实很有用处,在我所参与的这个项目之中,第三方的远程调用每个请求都需要参与鉴定,所以这样做非常方便,而且他是很独立的逻辑,这样做让业务逻辑代码很干净。和框架的其他功能一样,原理很简单,使用起来也很简单,大致看了下SpringMVC这一部分的源码,其实还是比较容易理解的。

  我们项目中仅仅用到了preHandle这个方法,而未用其他的,框架提供了一个已经实现了拦截器接口的适配器类HandlerInterceptorAdapter,继承这个类然后重写一下需要用到的方法就行了,可以少几行代码,这种方式Java中很多地方都有体现。

标签:容器,拦截器,请求,区别,action,过滤器,servlet
From: https://blog.csdn.net/qq_64064246/article/details/136984181

相关文章

  • 虚拟DOM和真实DOM的区别
    虚拟DOM(VirtualDOM)、DOM(RealDOM)是前端开发中常用的两种概念。什么是真实DOM?​真实DOM是浏览器中实际存在的DOM结构,它由浏览器解析HTML生成,并且直接与浏览器交互。当页面中的数据发生变化时,真实DOM会重新计算布局和渲染,这个过程比较耗费性能。什么是虚拟DOM?​虚拟DO......
  • GET和POST的请求的区别
     ......
  • python 列表、元组、字典、集合的区别
    目录列表(List)元组(Tuple)字典(Dictionary)集合(Set)列表(List)有序:列表中的元素是有序的,可以通过索引访问。可变:你可以修改列表,比如添加、删除或改变元素。可重复:列表可以包含重复的元素。语法:使用方括号 [] 定义,元素用逗号分隔。应用场景:当你有一个元素......
  • C/S结构与B/S结构的介绍,优缺点,区别,案例
    C/S结构与B/S结构的介绍,优缺点,区别,案例C/S结构与B/S结构是两种常见的软件架构模式,它们在网络应用和数据管理方面各有特色。以下是关于这两种结构的详细介绍、优缺点以及区别,并附带一些案例。一、C/S结构(客户端/服务器结构)C/S结构是一种软件系统体系结构,它将业务逻辑......
  • SpringCloud 和 Dubbo 区别: 比较微服务框架的差异
    1.1SpringCloud简介SpringCloud是一个用于构建云原生应用的框架集合,它为开发者提供了一套完整的工具链,用于快速搭建分布式系统。SpringCloud基于 SpringBoot 开发,具有如下特点:提供了丰富的组件,如配置管理、服务注册与发现、断路器等采用声明式的编程模型,易于上手与Spr......
  • reinterpret_cast 和 static_cast 的区别
    安全性:static_cast 是一个安全的类型转换,它只能转换具有继承关系或密切相关的类型,并且在编译时进行类型检查。reinterpret_cast 是一个不安全的类型转换,它可以将任何类型的指针转换为任何其他类型的指针,而无需考虑类型安全性。用途:static_cast 用于转换具有继承关系或密切......
  • 说说 HTTP1.0/1.1/2.0 的区别?
     一、HTTP1.0HTTP协议的第二个版本,第一个在通讯中指定版本号的HTTP协议版本HTTP1.0 浏览器与服务器只保持短暂的连接,每次请求都需要与服务器建立一个TCP连接服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求简单来讲,每次与服务器交互,都需要新......
  • Task.Run(async () =>{}) 和 Task.Run(() =>{})区别
    Task.Run(async()=>{}):Task.Run(async()=>{}) 表示运行一个异步任务,传入的是一个异步lambda表达式。异步lambda表达式可以包含 await 操作符,允许在异步任务中等待其他异步操作完成。如果异步lambda表达式内部包含 await 操作,整个 Task.Run(async()=>{......
  • ac仿真和stb仿真的区别
    加iprobe的stb方式是MIiddlebrookMethod,环路增益的公式是(Tv*Ti-1)/(Tv+Ti+2),Tv,Ti分别是电压增益和电流增益,但是ac方式测量的只是电压增益Tv。如果你采用ac方式在高阻点断开环路,那Ti近似为无穷。ac的方式和stb方式得到的环路增益基本一致,但是高频会有区别。如果你采用ac方式但没有......
  • etcd与redis之间的区别
    一、简介我们之前用了redis,那么好用为什么还要来用etcd呢,这里就来和大家聊聊为什么有的业务场景选择etcd。分析:在当今的分布式系统中,数据存储及一致性相当重要。etcd和redis都是我们最受欢迎的开源分布式数据存储的解决方案,但是他们有着不同的试用场景。下面我个人对其中二个的......