Java中的拦截器和过滤器有什么区别

简介: 过滤器Filter基于Servlet实现,过滤器的主要应用场景是对字符编码、跨域等问题进行过滤。Servlet的工作原理是拦截配置好的客户端请求,然后对Request和Response进行处理。Filter过滤器随着web应用的启动而启动,只初始化一次。Filter的使用比较简单,继承Filter 接口,实现对应的init、doFilter以及destroy方法即可。

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


(一)什么是过滤器


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

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


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


网络异常,图片无法展示
|

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


网络异常,图片无法展示
|

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


网络异常,图片无法展示
|

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


publicclassMyFilterimplementsFilter {
@Overridepublicvoidinit(FilterConfigfilterConfig) throwsServletException {
System.out.println("初始化拦截器");
    }
@OverridepublicvoiddoFilter(ServletRequestrequest, ServletResponseresponse, FilterChainchain) throwsIOException, ServletException {
//做一些处理chain.doFilter(request,response);
    }
@Overridepublicvoiddestroy() {
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,并且整个请求结束之后,执行该方法。

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


@ComponentpublicclassUserInterceptorimplementsHandlerInterceptor {
@OverridepublicbooleanpreHandle(HttpServletRequestrequest, HttpServletResponseresponse, Objecthandler) throwsException {
System.out.println("preHandle");
StringuserName=request.getParameter("userName");
Stringpassword=request.getParameter("password");
if (userName==null||password==null){
response.setStatus(500);
response.setContentType("text/html; charset=UTF-8");
response.getWriter().print("参数缺失");
returnfalse;
        }
//进行用户校验if (userName.equals("admin")&&password.equals("admin")){
returntrue;
        }else {
response.setStatus(500);
response.setContentType("text/html; charset=UTF-8");
response.getWriter().print("用户名或密码错误");
returnfalse;
        }
    }
@OverridepublicvoidpostHandle(HttpServletRequestrequest, HttpServletResponseresponse, Objecthandler, ModelAndViewmodelAndView) throwsException {
System.out.println("postHandle");
    }
@OverridepublicvoidafterCompletion(HttpServletRequestrequest, HttpServletResponseresponse, Objecthandler, Exceptionex) throwsException {
System.out.println("afterCompletion");
    }
}

编写完拦截器之后,通过一个配置类设置拦截器,并且可以通过

addPathPatternsexcludePathPatterns执行哪些请求需要被拦截,哪些不需要被拦截。

@ConfigurationpublicclassMvcConfigimplementsWebMvcConfigurer {
@AutowiredprivateUserInterceptoruserInterceptor;
@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry) {
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反射机制实现


(四)总结


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


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


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


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


网络异常,图片无法展示
|

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



相关文章
|
1天前
|
缓存 Java 数据库连接
java面试题目 强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?
【6月更文挑战第28天】在 Java 中,理解和正确使用各种引用类型(强引用、软引用、弱引用、幻象引用)对有效的内存管理和垃圾回收至关重要。下面我们详细解读这些引用类型的区别及其具体使用场景。
10 3
|
9天前
|
Java
Java中Comparable接口和Comparator接口的区别(如果想知道Java中Comparable接口和Comparator接口的区别,那么只看这一篇就足够了!)
Java中Comparable接口和Comparator接口的区别(如果想知道Java中Comparable接口和Comparator接口的区别,那么只看这一篇就足够了!)
|
1天前
|
安全 Java
使用FilterChain实现Java中的过滤器链
使用FilterChain实现Java中的过滤器链
|
2天前
|
存储 NoSQL Java
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
4 0
|
3天前
|
Java
Java中代码块区别及代码示例
Java中代码块区别及代码示例
|
4天前
|
前端开发 JavaScript 算法
javaweb(四)——过滤器与监听器
javaweb(四)——过滤器与监听器
|
4天前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
【6月更文挑战第26天】Java IO流涵盖字节流与字符流。字节流(InputStream/OutputStream)处理数据单位为字节,适用于二进制和文本,而字符流(Reader/Writer)专注于文本,处理单位为字符,处理编码转换。字符流在字节流基础上添加编码处理,以装饰器模式实现。文件复制示例展示了两者区别:字节流直接复制所有数据,字符流处理字符编码。理解并选择适当流类型对优化程序至关重要。
|
5天前
|
算法 Java 机器人
Java中的异常处理:Checked与Unchecked的区别
Java中的异常处理:Checked与Unchecked的区别
|
5天前
|
Java
【逻辑运算符】在Java中 &&和&的区别 ||和|的区别
【逻辑运算符】在Java中 &&和&的区别 ||和|的区别
4 0
|
6天前
|
Java
使用java文件过滤器输出制定格式文件路径
使用java文件过滤器输出制定格式文件路径
6 0