这两天了解到了拦截器和过滤器,现在对其进行总结整理

1. 过滤器与拦截器的基本概念

在知乎上看到一篇非常棒的:原文链接
从里面摘出来一些内容:


1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

2、由上面和拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。

3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射
4、Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。

5、Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理(反射)的方式来执行。

6、Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

过滤器和拦截器非常相似,但是它们有很大的区别
最简单明了的区别就是过滤器可以修改request,而拦截器不能
过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境
拦截器可以调用IOC容器中的各种依赖,而过滤器不能
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法
区别很多,大家可以去查下

总的来说
过滤器就是筛选出你要的东西,比如requeset中你要的那部分
拦截器在做安全方面用的比较多,比如终止一些流程

由上面的内容,再来看他们的应用场景,就很好理解了

拦截器应用场景

拦截器本质上是面向切面编程(AOP),符合横切关注点的功能都可以放在拦截器中来实现,主要的应用场景包括:

  • 登录验证,判断用户是否登录。
  • 权限验证,判断用户是否有权限访问资源,如校验token
  • 日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
  • 处理cookie、本地化、国际化、主题等。
  • 性能监控,监控请求处理时长等。
  • 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)

过滤器应用场景

  • 过滤敏感词汇(防止sql注入)
  • 设置字符编码
  • URL级别的权限访问控制
  • 压缩响应信息

2. 过滤器和拦截器的基本使用

(1).过滤器

过滤器的定义

import javax.servlet.*;
import java.io.IOException;public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//在这前后写一些过滤逻辑filterChain.doFilter(servletRequest,servletResponse);}}

配置启用自定义过滤器

import com.estudio.secretcore.filter.CoreFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean registrationBean() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());filterRegistrationBean.addUrlPatterns("/*");return filterRegistrationBean;}
}

(2). 拦截器

拦截器的定义

import com.alibaba.fastjson.JSON;
import com.estudio.secretcore.service.UserAuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class UserInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("走了拦截器");String token = request.getHeader("Authorization");if(token.equals("null")){return false;}System.out.println(token);String url = request.getRequestURI();System.out.println(url);//返回true表示放行,反之拦截return true;}// HandlerInterceptor 接口中的剩余方法,自己选择使用//postHandle Controller方法处理完之后@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {}// postHandle之后 并且 DispatcherServlet进行视图的渲染之后@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

关于HandlerInterceptor的方法补充

preHandle调用时间:Controller方法处理之前

preHandle的执行:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
若返回false,则表示拦截,中断执行

postHandle调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前

afterCompletion调用时间:postHandle之后 DispatcherServlet进行视图的渲染之后

启用拦截器

import com.estudio.secretcore.interceptor.UserInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate UserInterceptor userInterceptor;//启用自定义拦截器@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(userInterceptor);}//顺便配置跨域刚问@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")    // 允许跨域访问的路径.allowedOriginPatterns("*")   // 允许跨域访问的源.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") // 允许请求方法.maxAge(168000)    // 预检间隔时间.allowedHeaders("*")  // 允许头部设置.allowCredentials(true);  // 是否发送cookie}
}

SpringBoot 拦截器和过滤器区别及应用相关推荐

  1. SpringBoot 拦截器和过滤器

    拦截器和过滤器 时光飞逝,最近也是很忙,但是忙到最后发现在自己并没有太多的成长 工作 学习 生活 没想到成长是不经意间的,像是被 推着,让你身不由己 午休时间,写写博客,也是保留一些自己的时间和空间 ...

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

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

  3. 拦截器和过滤器区别_新手能看懂的(Interceptor)和(Filter)区别与使用!

    一.拦截器与过滤器 我们先了解一下过滤器和拦截器.这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的.在分析两者的区别之前,我们先理解一下AOP的概念,AOP不是一种具体的技术,而是一种 ...

  4. java 拦截器和过滤器区别(转载)

    2019独角兽企业重金招聘Python工程师标准>>> 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调  2.过滤器依赖与servlet容器,而拦截器不依赖与servl ...

  5. 详解拦截器和过滤器的区别

    拦截器和过滤器的区别 过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对acti ...

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

    首先了解什么是过滤器什么是拦截器 ①过滤器(Filter) 过滤器通过直接实现Filter接口实现,也可以通过@WebFilter注解实现特定的URL拦截 在Filter接口中定义了三个方法: ini ...

  7. java 拦截器和过滤器的区别

    介绍 在 Java Web 应用程序中,拦截器和过滤器是两种不同的机制,用于在请求/响应处理过程中进行拦截和过滤.两者都可以用来在请求到达目标资源之前对其进行预处理.修改或拦截. 但是,拦截器和过滤器 ...

  8. 区分Java拦截器和过滤器

    今天带大家分析java拦截器和过滤器的区别,文中有非常详细的解释说明,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下 一.过滤器(filter) 过滤器处于客户端与Web资源(Serv ...

  9. struts2中拦截器和过滤器的比较

    拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而 ...

  10. 【SpringMVC】拦截器和过滤器

    拦截器: 拦截器是springmvc中的一种,需要实现HandlerInterceptor接口. 拦截器和过滤器类似,功能方向侧重点不同. 过滤器是用来过滤器请求参数,设置编码字符集等工作. 拦截器是 ...

最新文章

  1. 【python图像处理】两幅图像的合成一幅图像(blending two images)
  2. 《HTML5多媒体应用开发》——第2章 HTML5多媒体元素2.1 Web多媒体历史
  3. 谷歌io大会 android p,谷歌I/O大会发布全新电视系统 Android P让电视变的更加智能...
  4. 《X86汇编语言:从实模式到保护模式》读书笔记之引言
  5. npm publish 发布一个 Angular 库的时候报错
  6. 一个最简单的 Github workflow 例子
  7. 两数之和Python解法
  8. 频域/s域/z域三大变换的发展史及其联系
  9. 克隆ubuntu硬盘_使用Ubuntu Live CD克隆硬盘
  10. qt4.8 mysql 驱动_Qt-4.8.5配置mysql驱动
  11. 前端学习(1185):数据响应式
  12. Verify the value of the CODE_SIGN_ENTITLEMENTS的解决办法
  13. 蓝牙耳机测试软件apk_蓝牙耳机弹窗app下载-蓝牙耳机弹窗软件v3.1.0安卓版_5577安卓网...
  14. JavaWeb公交调度系统的设计与实现
  15. erp java 开源_华夏ERP完整开源版J2EE代码
  16. 新手学python看什么书-书单狗 篇一:小白学Python,到底要看多少书?
  17. Webgame服务端分布式架构设计
  18. 炫龙银魂t1配置_炫龙 银魂T1一键重装系统win10教程
  19. Java-Swing编程介绍
  20. tms xdata、sparkle服务运行时显示拒绝访问的错误

热门文章

  1. PAT C语言 1031 查验身份证 (15 分) 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
  2. 图书管理系统数据库设计实验报告
  3. ssm+vue基于微信小程序的数学辅导教学学习系统#毕业设计
  4. 白帽子讲web安全读后感
  5. PPAPI开发之路(一)环境配置
  6. 微软文本转语音小工具(Text to speech)
  7. java se 通用能力-判断推理专项练习(选择题)
  8. 关于jar文件打不开的解决方法
  9. java怎么查看jar包_怎么查看Jar包源码?如何打开Jar文件?
  10. 修改文件 火车票买下铺_12306修改代码买下铺?12306码农太弱了吧 (转载)