过滤器

过滤器的定义

在客户端将请求发送到服务器端之前,拦截这些请求;在服务器端的响应返回给客户端之前,处理这些响应。
比如字符编码过滤器CharacterEncodingFilter,就是设置request和response中的字符编码方式。

过滤器的实现

方式一 利用WebFilter注解配置

@Slf4j
@WebFilter(filterName = "filter1", urlPatterns = {"/*"})
public class MyFirstFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("filter1 init method invoke....");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("filter1 doFilter method invoke....");//让过滤器继续往下执行filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {log.info("filter1 destroy method invoke....");}
}

在SpringBoot主程序类上添加Servlet组件扫描的注解@ServletComponentScan,运行程序即可看到控制台输出的init方法的调用输出内容,访问任意请求,都可以看到doFilter的方法内容输出。
以上代码可以实现过滤器的配置和使用,但是存在一个问题,当项目中有多个过滤器同时存在时,不能设置这些过滤器的执行顺序,需要借助FilterRegistrationBean类型的对象设置过滤器,可以再添加一个过滤器查看运行效果。

方式二:FilterRegistrationBean方式

将前面的两个过滤器类上的@WebFilter注解去掉,其他都不变,在项目中添加一个配置类专门针对过滤器配置,代码如下:

public class MyFilterRegistration {//注册第一个filter@Beanpublic FilterRegistrationBean registerMyFirstFilter() {FilterRegistrationBean  filterRegistrationBean = new FilterRegistrationBean();//注册FilterfilterRegistrationBean.setFilter(new MyFirstFilter());//配置过滤器的名字filterRegistrationBean.setName("filter1");//配置过滤器过滤的urlfilterRegistrationBean.addUrlPatterns("/*");filterRegistrationBean.setOrder(2);return filterRegistrationBean;}//注册第二个filter@Beanpublic FilterRegistrationBean registerMySecondFilter() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();//注册filterfilterRegistrationBean.setFilter(new MySecondFilter());//配置过滤器的名字filterRegistrationBean.setName("filter2");//配置过滤器过滤的urlfilterRegistrationBean.addUrlPatterns("/*");//设置执行顺序filterRegistrationBean.setOrder(1);return filterRegistrationBean;}
}

在使用setOrder()方法可以设置多个过滤器的执行顺序,其中值越小,优先级越高。
其他代码不变,再看代码的运行效果,会发现,doFilter方式是先执行MySecondFilter再执行MyFirstFilter。

拦截器

拦截器的定义

在Servlet的规范中并没有拦截器的概念,是在Spring框架中衍生出来的。
拦截器的处理:

拦截器中有三个方法:
1、 preHandle:表示被拦截的URL 对应的控制层方法执行前的自定义处理逻辑
2、 postHandle:表示被拦截的URL对应的控制层方法执行后的自定义处理逻辑,此时还没有对ModelAndView进行渲染
3、 afterCompletion:表示此时ModelAndView已经做了页面渲染,执行拦截器的自定义处理逻辑。

拦截器的实现

添加一个类,实现HandlerInterceptor接口

@Slf4j
public class MyFirstInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("preHandle method invoke....");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.info("postHandle method invoke....");log.info("要跳转的页面是:" + modelAndView.getViewName());}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info("afterCompletion method invoke....");}
}

接着,配置该拦截器,在之前写的WebMvcConfigurer接口的实现类中添加拦截器的注册信息:
`

拦截器和过滤器的区别

从请求处理的生命周期上看,拦截器和过滤器的作用是类似的,区别是:
过滤器使用的是Filter接口,实现的是init、doFilter和destroy方法
拦截器使用的是HandlerInterceptor接口,实现的是preHandle、postHandle、afterCompletion方法。
过滤器和拦截器的执行位置

过滤器和拦截器的使用场景:
规范不同的:Filter是Servlet规范中定义的组件,在Servlet容器内生效,而拦截器时Spring框架定义的,在Spring上下文中生效;
拦截器可以获取并使用Spring IOC容器中的bean,但过滤器不行。
拦截器可以访问Spring上下文值对象,如ModelAndView,过滤器不行。
过滤器的力度比拦截器的力度大,因为过滤器是在进入Servlet容器之前处理请求,拦截器则是在进入到Servlet容器之内处理请求,过滤器比较适合系统级别的处理动作,比如权限认证之类的。
拦截器比过滤器力度小,更适合分模块、分范围的统一业务逻辑处理。

Spring Boot 过滤器与拦截器的使用及其区别 和过滤器怎么设置运行顺序相关推荐

  1. Spring Boot实战:拦截器与过滤器

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

  2. spring boot 拦截器获取controller返回的数据_高级码农Spring Boot实战与进阶之过滤器和拦截器的使用及其区别...

    众所周知的Spring Boot是很优秀的框架,它的出现简化了新Spring应用的初始搭建以及开发过程,大大减少了代码量,目前已被大多数企业认可和使用.这个专栏将对Spring Boot框架从浅入深, ...

  3. spring 两次进入拦截器_过滤器和拦截器的 6 个区别,别再傻傻分不清了

    点击上方 肉眼品世界,选择 设为星标 深度价值体系传递 作者 :程序员内点事 来源 :toutiao.com/i6834310440495874563 毕竟这两种工具开发中用到的频率都相当高,应用起来 ...

  4. Spring Boot 实现登录拦截器,这才是正确的姿势!!

    原文:https://blog.csdn.net/qq_27198345/article/details/111401610 对于管理系统或其他需要用户登录的系统,登录验证都是必不可少的环节,在Spr ...

  5. 过滤器、拦截器、监听器的区别与使用

    一.拦截器与过滤器的区别 过滤器 (Filter) 过滤器的配置比较简单,直接实现Filter 接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter 接口中定义了三个方法 ...

  6. 过滤器VS拦截器的4个区别,看完豁然开朗!

    Spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查.日志记录等.但它们之间又有很大区别,所以本文磊哥就带大家全面了解一下什么是过滤器?什么 ...

  7. java过滤器和拦截器的使用及其区别

    1.过滤器: 依赖于servlet容器.在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次.使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数 ...

  8. 过滤器、拦截器、AOP、ControllerAdvcie的使用对比、执行顺序及代码教程

    文章目录 前言 过滤器Filter 简介 使用方法 代码实现 测试 拦截器Interceptor 简介 使用方法 代码实现 测试 ControllerAdvice 简介 使用方法 代码实现 测试 AO ...

  9. Spring Boot实战:过滤器、拦截器与切片

    Spring Boot实战:过滤器.拦截器与切片 Q:使用过滤器.拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系 过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是Se ...

最新文章

  1. 竞赛人必备的100篇NLP论文
  2. 公平与精确同样重要!CMU提出学习公平表征方法,实现算法公平
  3. IntelliJ IDEA 添加本地xsd文件
  4. 听说你想去大厂看妹子,带你看看字节跳动产品运营岗面试是啥样?
  5. 年度最Hot,三大热点赛题,首届「马栏山」杯国际音视频算法大赛正式开赛
  6. 数据安全 数据销毁_如何安全销毁敏感数据CD / DVD?
  7. leetcode 103. 二叉树的锯齿形层次遍历
  8. 信息学奥赛一本通(2027:【例4.13】三角形)
  9. Android通过命令连接wifi(解决usb不能用+无屏幕情况)
  10. html宠物医院制作与实现,基于JSP的宠物医院系统设计与实现-毕业设计.doc
  11. 企业微信登陆服务器设置,企业微信怎么登入
  12. php记录sql语句,sql语句记录
  13. 矩阵满秩分解原理解释
  14. 一文带小白玩转NFC、门禁卡
  15. 智能硬件开发如何选择低功耗MCU?
  16. EleutherAI GPT-Neo: 穷人的希望
  17. Android 读取本地Word/Pdf/Txt文件转文本输出
  18. Java获取当天0时0分0秒时间的方法
  19. linux 五种 IO 模型
  20. f烽火ExMobi,移动应用平台的互联网思维

热门文章

  1. HTML和CSS知识点总结(包括H5和C3)
  2. 2020年全国天梯赛赛前个人专题强化赛---C(最短路)
  3. 删除数据库 [MySQL][数据库]
  4. 【八股文】5 My Batis
  5. 微信小程序 旅游景点酒店预订管理系统pcAndroid hbuilderx App毕业设计
  6. GripSeal快速接头钢管 铝管 不锈钢管外径密封堵头 G30系列高压外包快速连接器
  7. 计算机网络的五层协议
  8. 史上最全的亚马逊、ebay、shopee多账号运营防关联技巧__多账号管理、独立浏览器AdsPower
  9. NAT与V/P/N都能访问内网,那他们有什么区别?
  10. SQL 附加数据库出错:系统错误5(拒绝访问)