JAVA过滤器以及拦截器的使用介绍

一 过滤器

1.1 过滤器简单介绍

JAVA过滤器能够对目标资源的请求和响应进行截取,对目标资源的请求和响应进行预处理,然后交给下一个过滤器或servlet处理。

通过过滤器进行预处理操作的主要逻辑都是在doFilter()方法中进行实现,这也是需要重点关注的方法,至于init()destroy()分别是初始化以及销毁方法。

1.2 自定义过滤器

那么,应该如何自定义过滤器呢?

  1. 实现 Filter 接口;
  2. 通过@WebFilter注解完成过滤路径设置

其实就是这么简单,如下:

/*** 通过实现 Filter 接口来设置一个过滤器* 通过 @Component 注解使之成为spring的一个Bean* 通过 @WebFilter(urlPatterns = {"/*"}) 设置会进入该过滤器的请求路径*/
@Component
@WebFilter(urlPatterns = {"/common/test", "/common/test01"}) //设置会被过滤处理的路请求径
@Order(0)   //如果存在多个过滤器 设置过滤器的优先级,值越小,优先级越高,doFilter() 越早执行
public class FirstFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("我是第一个过滤器 init~");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("我是第一个过滤器 doFilter~");HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;filterChain.doFilter(request, response);}@Overridepublic void destroy() {System.out.println("我是第一个过滤器 destroy~");}}

这里我还设置了第二个过滤器,代码和第一个过滤器几乎一样,除了优先级以及简单的日志输出,所以具体代码我就不重复贴出来了。

1.3 过滤器测试

这个待会儿和下面大的拦截器一起进行测试,便于观察(我就是懒图个省事)。

二 拦截器

2.1 拦截器简单介绍

JAVA里的拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。

拦截器大部分是基于动态代理实现的,拦截是AOP的一种实现策略。

2.2 自定义拦截器

那么,如何自定义一个拦截器呢?

  1. 实现HandlerInterceptor接口;
  2. 实现WebMvcConfigurer配置接口,进行自定义过滤i的注册;

具体代码实现如下(基于SpringBoot2.x):
首先自然是实现HandlerInterceptor接口,然后实现相应的方法,具体作用以及介绍注释有说明:

/*** 通过实现 HandlerInterceptor 接口实现一个拦截器* 要想使得拦截器在SpringBoot生效:* 第一需要在实现类上添加注解 @Component* 第二需要在配置类注册拦截器*/
@Component
public class FirstInterceptor implements HandlerInterceptor {/*** 该方法在处理拦截之前执行*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o)throws Exception {System.out.println("我是第一个拦截器 preHandle");//TODO 根据实际业务需求 符合要求的才返回true 不符合的返回false//注意: 如果请求参数是json格式,那么不能通过 request.getParameter()的方式获取String first = request.getParameter("first");if (Objects.equals(first, "111")) {return true;}response.setContentType("application/json,charset=utf-8");response.getOutputStream().write("不符合要求,不放行".getBytes(StandardCharsets.UTF_8));return false;}/*** 该方法仅在方法没有抛出异常且没有被拦截且执行成功的时候,才会进入执行*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable ModelAndView modelAndView) throws Exception {System.out.println("我是第一个拦截器 postHandle");}/*** 该方法无论方法是否抛出异常,只要没被拦截,最后都会进入执行*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable Exception ex) throws Exception {System.out.println("我是第一个拦截器 afterCompletion");}}

既然有了第一个拦截器,很显然,还会有第二个拦截器。为什么要定义多个拦截器呢?其实我的目的是为了展示多个拦截器之间的执行顺序

OK,接下来是第二个拦截器,具体代码和第一个拦截器几乎是一样的,区别就在于没有做任何拦截处理,直接放行。所以我就不重复贴出来了。

好了,拦截器定义好了还不够,还需要将其进行注册,接下来便是注册部分:

/*** 该配置类用于注册拦截器*/
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate FirstInterceptor firstInterceptor;@Autowiredprivate SecondInterceptor secondInterceptor;/*** 拦截器注册 可注册多个 执行顺序和注册顺序一样** @param registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {//拦截器的执行顺序取决与注册顺序registry.addInterceptor(firstInterceptor)//设置会被该拦截器拦截的请求路径  /** 表示所有.addPathPatterns("/**");registry.addInterceptor(secondInterceptor).addPathPatterns("/**")//设置该拦截器不会拦截的请求路径.excludePathPatterns("/common/test01");}}
2.3 拦截器+过滤器测试

具体控制器层测代码如下:

@RestController
public class TestController {@GetMapping("/common/test")public void test() {System.out.println("我是test");}@GetMapping("/common/test01")public void test01() {System.out.println("我是test01");}}

OK,让我们请求 /common/test 接口,看看会有什么效果


执行顺简单总结一下:

  • 可以看到,因为设置了第一个过滤器的优先级高于第二个过滤器,所以第一个过滤器优先执行。
  • 过滤器是优先于拦截器执行的。
  • 拦截器的执行顺序取决于注册顺序,也就是代码里的注册顺序。
  • 第一个拦截器并不是所有方法都是优先执行的,仅有preHandle()方法是优先执行的。

三 二者对比

  • 过滤器是基于函数回调的,而拦截器则是基于Java反射的。
  • 过滤器依赖于servlet容器,拦截器不依赖于servlet容器。
  • 过滤器几乎对所有的请求起作用,l拦截器只能对action请求起作用。
  • 拦截器可以访问Action的上下文,值栈里的对象,而过滤器不能。
  • 在Action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

一般拦截器用来做一些接口签名或者参数校验之类的,当然也可以做日志处理。功能比过滤器更加强大,也更加灵活。

JAVA过滤器以及拦截器的基本介绍以及使用相关推荐

  1. Java过滤器与拦截器区别与执行先后关系

    拦截器和过滤器的区别 过滤器和拦截器的区别: 首先关于文件目录要注意的地方: 把jsp文件放在WEB-INF目录下其实是: 为了保证系统的安全性,web应用的内容结构中,把所有的静态内容放在web-c ...

  2. Java 过滤器与拦截器的区别

    什么是过滤器(Filter) 过滤器,是在java web中将你传入的request.response提前过滤掉一些信息,或者提前设置一些参数.然后再传入Servlet或Struts2的 action ...

  3. java过滤器原理,拦截器,过滤器,监听器 区别及执行顺序

    本文引用该作者(花开半夏)著作内容,觉得写的很好,记录一下便于回看防止失踪,更多详情请查看原作者. 同时还搜罗了其他便于理解的博文感兴趣的可以看看促进理解 拦截器,过滤器,监听器执行顺序(被拦截个人过 ...

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

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

  5. Java过滤器与拦截器的区别(一文搞懂)

    Hey,我是寅贝勒,后端开发一枚

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

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

  7. Java中的过滤器和拦截器

    一.简介 1.什么是拦截器? (1)在AOP中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. (2)拦截器是动态拦截Action调用的对象.它提供了 ...

  8. java ssh过滤器_SSH中的过滤器,拦截器,监听器的一些基本认识

    今天被一个朋友问起在SSH的项目中,过滤器.拦截器.监听器都分别是什么,又都是干什么用的.结合目前学习到的和自己应用的体会,大概有以下几个方面. 1.过滤器:顾名思义就是过滤请求内容的,所谓的过滤就是 ...

  9. springboot中的过滤器、拦截器、监听器整合使用

    文章目录 controller层 过滤器 拦截器 拦截器介绍 使用拦截器 监听器 监听器介绍 使用监听器 修改启动类 controller层 用于测试 @RestController public c ...

最新文章

  1. 《Maven 实战》笔记之setting.xml介绍
  2. 【知识星球】超3万字的网络结构解读,学习必备
  3. 白话详细解读(七)----- CBAM:Convolutional Block Attention Module
  4. JBPM学习笔记(1)
  5. easyui源码翻译1.32--ValidateBox(验证框)
  6. 非等值连接,外连接,自连接,子查询
  7. 一道无限级分类题的 PHP 实现
  8. Devexpress - office - 效果
  9. Java设计模式05:常用设计模式之原型模式(创建型模式)
  10. SDL1.3(C语言)程序移植LINUX。。。
  11. Mac 上删除用户或群组教程
  12. 硅谷外卖安装axios报错
  13. thinkpad卡在logo界面_win7系统开机卡在Thinkpad LOGO画面无法进入桌面的解决方法
  14. Devise Gem简介
  15. 奥迪坚技术革新带动信用卡呼叫中心管理升级
  16. 一个后端朋友面试一个月的经验总结
  17. 计讯物联环保数采仪全系列产品为节能降耗减碳贡献绿色力量
  18. SLF4J的高级写法
  19. Unity程序框架总结归置系列(3)——事件中心
  20. java中上传本地图片

热门文章

  1. 中国最伟大的杀人犯(海龙哥)
  2. 人脸识别(cv2,face_recognition)
  3. Uncaught TypeError: Cannot set property 'areaCode' of undefined
  4. windows7怎么升级10_lol手游怎么升级快 英雄联盟手游升到10级最快技巧分享[多图]-手游问答...
  5. 计算机专业3.6的绩点是什么水平,绩点3.5算什么水平
  6. 基于AT89C52单片机的温度检测报警设计
  7. 产品经理|产品设计理念
  8. Android音乐播放器开发(6)—ListView组件创建歌曲播放列表(内含原理分析)
  9. 05-Elasticsearch-DSL高级检索[分页, 分词, 权重, 多条件, 过滤, 排序, 关键词高亮, 深度分页, 滚动搜索, 批量Mget]...
  10. 【深度学习】资源:最全的 Pytorch 资源大全