拦截器与过滤器

流程图

拦截器vs过滤器

拦截器是SpringMVC的技术

过滤器的Servlet的技术

先过过滤器,过滤器过完才到DispatcherServlet;

拦截器归属于SpringMVC,只可能拦SpringMVC的东西;

拦截器说白了就是为了增强,可以在请求前进行增强,也可以在请求后进行增强,但是不一定同时在前后都增强。

区别

SpringMVC技术架构图

项目Demo

项目地址

依赖

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.7.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

Interceptor拦截器

package com.test.filtertest.inter;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: zhangzengxiu* @createDate: 2022/4/22*/
@Component
public class TestInter1 implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("TestInter1 preHandle...");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("TestInter1 postHandle...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("TestInter1 afterCompletion...");}
}

Interceptor拦截器要注册

package com.test.filtertest.config;import com.test.filtertest.inter.TestInter1;
import com.test.filtertest.inter.TestInter2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** @author zhangzengxiu* @date 2022/4/22*/
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate TestInter1 testInter1;@Autowiredprivate TestInter2 testInter2;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//默认/** 拦截所有请求registry.addInterceptor(testInter1).addPathPatterns("/**");registry.addInterceptor(testInter2);}
}

拦截顺序

多拦截器拦截顺序取决于registry的注册顺序

Filter过滤器

1、多Filter不指定过滤顺序

package com.test.filtertest.filter;import org.springframework.core.annotation.Order;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;/*** @author zhangzengxiu* @date 2022/4/22*/
@WebFilter(filterName = "TestFilter1", urlPatterns = "/*")
//@Order(2) //filter这样定义拦截顺序无效,还是会按照类名去拦截
public class TestFilter1 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("TestFilter1 filter before ...");filterChain.doFilter(servletRequest, servletResponse);System.out.println("TestFilter1 filter after ...");}@Overridepublic void destroy() {}
}

加了@WebFilter注解的过滤器要生效,需要在启动类上加一个注解

@ServletComponentScan

2、多Filter指定过滤顺序

如果要设置过滤顺序的话,在Filter上添加@Order 不会生效,还是会默认根据Filter过滤器的类名去进行过滤。
如果想要指定拦截顺序,需要添加一个配置类,通过设置Order的值去设置过滤顺序,Order数值越小优先级越高

package com.test.config;import com.test.filter.TestFilter1;
import com.test.filter.TestFilter2;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.servlet.Filter;/*** filter过滤器配置** @author: zhangzengxiu* @createDate: 2022/4/24*/
@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean testFilter1() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();Filter testFilter1 = new TestFilter1();filterRegistrationBean.setFilter(testFilter1);filterRegistrationBean.addUrlPatterns("/*");filterRegistrationBean.setName("testFilter1");filterRegistrationBean.setOrder(2);//指定过滤顺序,数值越小优先级越高return filterRegistrationBean;}@Beanpublic FilterRegistrationBean testFilter2() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();Filter testFilter2 = new TestFilter2();filterRegistrationBean.setFilter(testFilter2);filterRegistrationBean.setName("testFilter2");filterRegistrationBean.addUrlPatterns("/*");filterRegistrationBean.setOrder(1);//指定过滤顺序,数值越小优先级越高return filterRegistrationBean;}
}

1、同时原本Filter过滤器上的@WebFilter(filterName = “TestFilter1”, urlPatterns = “/*”)
这个注解最好去掉,否则bean重复会报错,要么bean名称不要重复,换个名称。但是不去掉的话@ServletComponentScan也要被保留,最好统一格式,只使用config配置。
2、启动类上的@ServletComponentScan 注解也不需要了,可以去掉了,因为不用扫描@WebFilter注解了。但是如果@WebFilter还保留了,那么就不能去掉了。不然加了@WebFilter的过滤器就不会生效了,因为没扫到。

Java之拦截器与过滤器相关推荐

  1. java中拦截器 过滤器 监听器都有什么区别

    过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts2的action进行业务逻辑,比如过滤掉非法u ...

  2. Java(Spring拦截器、过滤器、AOP)

    过滤器: 过滤器是servlet提供的API,需要实现javax.servlet.Filter接口.过滤器可以拦截到方法的请求和响应(ServletRequest request, SetvletRe ...

  3. SpringMVC框架 学习DAY_03:@RequestMapping注解/拦截器与过滤器

    1. 关于@RequestMapping注解 在控制器中,在处理请求的方法之前添加@RequestMapping注解,可以配置请求路径与处理请求的方法的映射关系! 在@RequestMapping注解 ...

  4. Struts2中的拦截器与过滤器学习

    拦截器是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法 ,比如动态代理就是拦截器的简单实现,过滤器是在java web中,你传入的request,res ...

  5. 框架:Spring Aop、拦截器、过滤器的区别

    Spring Aop.拦截器.过滤器的区别 Filter过滤器:拦截web访问的url地址. Interceptor拦截器:拦截以.action结尾的url,拦截Action的访问. Spring A ...

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

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

  7. 拦截器,过滤器,监听器原理

    过滤器 创建一个Filter 只需两个步骤:  (1)创建Filter 处理类: (2)在web.xml 文件中配置Filter .  创建Filter 必须实现javax.servlet.Filte ...

  8. Struts2 拦截器: 拦截器与过滤器区别

    1.首先要明确什么是拦截器.什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加 ...

  9. 记录请求的耗时(拦截器、过滤器、aspect)

    记录请求的耗时(拦截器.过滤器.aspect) 文章前言 记录控制器请求的耗时处理通常有三种实现方式,分别是:过滤器.拦截器.aspect:下文将逐一实现. 1.Filter 过滤器 1.1.方法说明 ...

  10. spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)

    上一篇:spring boot 1.5.4 整合webService(十五) 1      Spring Boot整合redis和缓存 Spring Boot中除了对常用的关系型数据库提供了优秀的自动 ...

最新文章

  1. Blend for Visual Studio 2013
  2. 不忘初心,努力做最好的自己
  3. android json 解析,android json解析 泛型
  4. 蓝桥杯 基础练习 字母图形
  5. 通过bindservice方式调用服务方法里面的过程
  6. 完美的迅捷PDF在线转换软件
  7. 银联支付接口申请流程-傲付宝
  8. Java学习笔记(十)——开发个小项目(GoBang2.0)
  9. R语言面积图 area chart
  10. linux系统下复制粘贴不了怎么办,电脑复制粘贴不了怎么解决?三种解决办法 了解一下...
  11. MySQL 怎么插入10天前的日期_使用 MySQL 的 SQL_MODE 有哪些坑,你知道么?
  12. Java实现 LeetCode 756 金字塔转换矩阵(DFS)
  13. google map的api价格介绍
  14. 大幅面遥感影像多尺度分割与尺度转换-初探
  15. 使用美国国立医学图书馆编辑的最新版Index Medicus中医学主题词表(MeSH)
  16. 一个软件工程师的7年工作经验总结
  17. js 随机选取动画_jquery实现随机运动动画
  18. Python实现迪杰斯特拉算法和贝尔曼福特算法求解最短路径
  19. Android2019年必须知道的史上最全框架、最全开源App(高级开发人员必看,面试必看)
  20. 2021考研 张 宇 强化班已经开课了

热门文章

  1. Python深度学习---第1章 什么是深度学习
  2. 图书管理分类统计c语言,C语言实现图书管理系统
  3. 【Java】java插件化开发
  4. 微信小程序代码提交步骤
  5. Failed to scan [file:/D:/software/maven/apache-maven-repository/org/ujmp/ujmp-core/0.3.0/json-20141
  6. 多商户商城系统源码 B2B2C商城020社区团购 单多商户入驻商城H5系统源码
  7. ajax 上传文件 data,ajax文件上传-FormData()
  8. 让无代理设置参数的软件通过代理服务器联网
  9. 计算机组成原理白中英第四章,白中英计算机组成原理第四章答案.ppt
  10. Java思维导图(3)