Java中的拦截器和过滤器有什么区别
本文收录于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");}
}
编写完拦截器之后,通过一个配置类设置拦截器,并且可以通过addPathPatterns和excludePathPatterns执行哪些请求需要被拦截,哪些不需要被拦截。
@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中的拦截器和过滤器有什么区别相关推荐
- 拦截器和过滤器有什么区别?
首先了解什么是过滤器什么是拦截器 ①过滤器(Filter) 过滤器通过直接实现Filter接口实现,也可以通过@WebFilter注解实现特定的URL拦截 在Filter接口中定义了三个方法: ini ...
- java web 过滤器 拦截器 监听器_Java中的拦截器和过滤器,可不是同一个东西
过滤器(Filter) 过滤器就如上面的水质过滤器一样,把管道中的水进行一遍过滤再使用.过滤器基于filter接口中的doFilter回调函数,主要的用途是设置字符集.控制权限.控制转向.做一些业务逻 ...
- java 拦截器和过滤器的区别
介绍 在 Java Web 应用程序中,拦截器和过滤器是两种不同的机制,用于在请求/响应处理过程中进行拦截和过滤.两者都可以用来在请求到达目标资源之前对其进行预处理.修改或拦截. 但是,拦截器和过滤器 ...
- 区分Java拦截器和过滤器
今天带大家分析java拦截器和过滤器的区别,文中有非常详细的解释说明,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下 一.过滤器(filter) 过滤器处于客户端与Web资源(Serv ...
- struts2中拦截器和过滤器的比较
拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而 ...
- SpringBoot 拦截器和过滤器
拦截器和过滤器 时光飞逝,最近也是很忙,但是忙到最后发现在自己并没有太多的成长 工作 学习 生活 没想到成长是不经意间的,像是被 推着,让你身不由己 午休时间,写写博客,也是保留一些自己的时间和空间 ...
- 关于SSM框架设置拦截器和过滤器
我们知道拦截器和过滤器都是在项目中起到拦截过滤请求的功能,所以可能在设置的时候会傻傻分不清.这里我们先来比较它们的区别. 过滤器Filter是JavaEE标准,在Servlet的规范中定义的,是Ser ...
- 详解拦截器和过滤器的区别
拦截器和过滤器的区别 过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对acti ...
- 拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别
转自:https://www.cnblogs.com/shangc/p/5939708.html 拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别.其主要区别为以下几点: 1)拦截器是基于 ...
- 【SpringMVC】拦截器和过滤器
拦截器: 拦截器是springmvc中的一种,需要实现HandlerInterceptor接口. 拦截器和过滤器类似,功能方向侧重点不同. 过滤器是用来过滤器请求参数,设置编码字符集等工作. 拦截器是 ...
最新文章
- WPF Snoop 2.7 源码研究
- Python 越被黑越红?2 万程序员这么说......
- 关于fragment
- LeetCode Monotonic Array(数组单调性)
- Irvine64链接库过程的使用说明 Microsoft x64 调用规范 添加Irvine64.obj 64位链接库错误及解决方法
- 操作系统Linux环境下动态分区存储管理的内存分别配回收
- xss_url通关_1-10
- php将数组值用 分开,PHP将数组中的多个值替换为另一个数组
- 【文末福利】算法大赛评委共话技术趋势,这场直播值得一看!
- 回顾云计算项目的得与失
- 现代操作系统(原书第4版)英文中文答案
- 计算机应用基础数制试题及答案,计算机应用基础试题及答案1
- match函数的用法
- 音视频传输流程和编解码基本概念
- 无线连接打印服务器,如何用旧电脑架设无线网络打印服务器
- 友盟QQ第三方登录分享
- 对计算机进行重镜像错误,Windows 10 使用系统镜像恢复系统出现内部错误?
- 小波学习笔记——模极大值去噪
- 360与腾讯骂战升级
- 大专生出身?java技术栈xmind
热门文章
- 数据中心供配电系统继电保护基础知识
- 苍井空详细介绍(婚后生活)
- 混淆的艺术-(苍井空变凤姐)Proguard源码分析(一)前言和计划
- 学以致用深入浅出数字信号处理 pdf_数字阵列雷达--相控阵专题讲座之三
- Windows - 电脑屏幕眼睛保护色的取值
- JAVA日期格式化大写YYYY-MM-dd和小写yyyy-MM-DD的坑
- Chrome 插件PPAPI 开发(一)环境搭建
- Carplay测试-Carplay认证预测试服务-Siri AudioTest-ITU-T P.1110 测试-ITU-T P.1100车载免提音测试
- matlab 固态 机械_忆捷固态硬盘怎么样(2款忆捷固态硬盘测评)
- PHP中文手册官方下载地址