本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看

(一)什么是过滤器

过滤器Filter基于Servlet实现,过滤器的主要应用场景是对字符编码、跨域等问题进行过滤。Servlet的工作原理是拦截配置好的客户端请求,然后对Request和Response进行处理。Filter过滤器随着web应用的启动而启动,只初始化一次。

Filter的使用比较简单,继承Filter 接口,实现对应的init、doFilter以及destroy方法即可。

1、init:在容器启动时调用初始化方法,只会初始化一次

2、doFilter:每次请求都会调用doFilter方法,通过FilterChain 调用后续的方法

3、destroy:当容器销毁时,执行destory方法,只会被调用一次。

下面是详细的代码编写方式:

public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始化拦截器");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//做一些处理chain.doFilter(request,response);}@Overridepublic void destroy() {System.out.println("销毁拦截器");}
}

(二)什么是拦截器

拦截器是SpringMVC中实现的一种基于Java反射(动态代理)机制的方法增强工具,拦截器的实现是继承HandlerInterceptor 接口,并实现接口的preHandle、postHandle和afterCompletion方法。

1、preHandle:请求方法前置拦截,该方法会在Controller处理之前进行调用,Spring中可以有多个Interceptor,这些拦截器会按照设定的Order顺序调用,当有一个拦截器在preHandle中返回false的时候,请求就会终止。

2、postHandle:preHandle返回结果为true时,在Controller方法执行之后,视图渲染之前被调用

3、afterCompletion:在preHandle返回ture,并且整个请求结束之后,执行该方法。

具体的代码实现如下,首先编写一个拦截器:

@Component
public class UserInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");String userName=request.getParameter("userName");String password = request.getParameter("password");if (userName==null||password==null){response.setStatus(500);response.setContentType("text/html; charset=UTF-8");response.getWriter().print("参数缺失");return false;}//进行用户校验if (userName.equals("admin")&&password.equals("admin")){return true;}else {response.setStatus(500);response.setContentType("text/html; charset=UTF-8");response.getWriter().print("用户名或密码错误");return false;}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");}
}

编写完拦截器之后,通过一个配置类设置拦截器,并且可以通过addPathPatternsexcludePathPatterns执行哪些请求需要被拦截,哪些不需要被拦截。

@Configuration
public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate UserInterceptor userInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(userInterceptor).addPathPatterns("/**").excludePathPatterns("/error");}
}

(三)拦截器与过滤器的区别

相同点

1、拦截器与过滤器都是体现了AOP的思想,对方法实现增强,都可以拦截请求方法。

2、拦截器和过滤器都可以通过Order注解设定执行顺序

不同点

1、过滤器属于Servlet级别,拦截器属于Spring级别
Filter是在javax.servlet包中定义的,要依赖于网络容器,因此只能在web项目中使用。

Interceptor是SpringMVC中实现的,归根揭底拦截器是一个Spring组件,由Spring容器进行管理。

2、过滤器和拦截器的执行顺序不同

下面通过一张图展示Filter和Interceprtor的执行顺序


首先当一个请求进入Servlet之前,过滤器的doFilter方法进行过滤,

进入Servlet容器之后,执行Controller方法之前,拦截器的preHandle方法进行拦截,

执行Controller方法之后,视图渲染之前,拦截器的postHandle方法进行拦截,

请求结束之后,执行拦截器的postHandle方法。

3、过滤器基于函数回调方式实现,拦截器基于Java反射机制实现

(四)总结

实际开发中,拦截器的应用场景会比过滤器要更多,下面是拦截器和过滤器的主要应用场景

拦截器的应用场景:权限控制,日志打印,参数校验

过滤器的应用场景:跨域问题解决,编码转换

我翻了一下历史项目的代码,拦截器在用户权限校验场景下使用会比较多,由于一般是前后端分离项目,过滤器的使用场景就会少很多。

拦截器和过滤器算是比较常用的了,但是还是得注意两者的差距,我是鱼仔,我们下期再见!

Java中的拦截器和过滤器有什么区别相关推荐

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

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

  2. java web 过滤器 拦截器 监听器_Java中的拦截器和过滤器,可不是同一个东西

    过滤器(Filter) 过滤器就如上面的水质过滤器一样,把管道中的水进行一遍过滤再使用.过滤器基于filter接口中的doFilter回调函数,主要的用途是设置字符集.控制权限.控制转向.做一些业务逻 ...

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

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

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

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

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

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

  6. SpringBoot 拦截器和过滤器

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

  7. 关于SSM框架设置拦截器和过滤器

    我们知道拦截器和过滤器都是在项目中起到拦截过滤请求的功能,所以可能在设置的时候会傻傻分不清.这里我们先来比较它们的区别. 过滤器Filter是JavaEE标准,在Servlet的规范中定义的,是Ser ...

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

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

  9. 拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别

    转自:https://www.cnblogs.com/shangc/p/5939708.html 拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别.其主要区别为以下几点: 1)拦截器是基于 ...

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

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

最新文章

  1. WPF Snoop 2.7 源码研究
  2. Python 越被黑越红?2 万程序员这么说......
  3. 关于fragment
  4. LeetCode Monotonic Array(数组单调性)
  5. Irvine64链接库过程的使用说明 Microsoft x64 调用规范 添加Irvine64.obj 64位链接库错误及解决方法
  6. 操作系统Linux环境下动态分区存储管理的内存分别配回收
  7. xss_url通关_1-10
  8. php将数组值用 分开,PHP将数组中的多个值替换为另一个数组
  9. 【文末福利】算法大赛评委共话技术趋势,这场直播值得一看!
  10. 回顾云计算项目的得与失
  11. 现代操作系统(原书第4版)英文中文答案
  12. 计算机应用基础数制试题及答案,计算机应用基础试题及答案1
  13. match函数的用法
  14. 音视频传输流程和编解码基本概念
  15. 无线连接打印服务器,如何用旧电脑架设无线网络打印服务器
  16. 友盟QQ第三方登录分享
  17. 对计算机进行重镜像错误,Windows 10 使用系统镜像恢复系统出现内部错误?
  18. 小波学习笔记——模极大值去噪
  19. 360与腾讯骂战升级
  20. 大专生出身?java技术栈xmind

热门文章

  1. 数据中心供配电系统继电保护基础知识
  2. 苍井空详细介绍(婚后生活)
  3. 混淆的艺术-(苍井空变凤姐)Proguard源码分析(一)前言和计划
  4. 学以致用深入浅出数字信号处理 pdf_数字阵列雷达--相控阵专题讲座之三
  5. Windows - 电脑屏幕眼睛保护色的取值
  6. JAVA日期格式化大写YYYY-MM-dd和小写yyyy-MM-DD的坑
  7. Chrome 插件PPAPI 开发(一)环境搭建
  8. Carplay测试-Carplay认证预测试服务-Siri AudioTest-ITU-T P.1110 测试-ITU-T P.1100车载免提音测试
  9. matlab 固态 机械_忆捷固态硬盘怎么样(2款忆捷固态硬盘测评)
  10. PHP中文手册官方下载地址