spring 框架中拦截器与过滤器的区别及拦截器使用详解
在 spring 框架的开发过程中,拦截器和过滤器都是非常重要的组件,它们都可以对请求进行拦截和处理,但在实现原理、应用场景等方面存在明显差异。本文将深入剖析两者的区别,并通过详细的代码示例介绍 spring 拦截器的使用步骤。
一、拦截器与过滤器的区别
1.1 所属体系与运行环境
过滤器(filter):是 servlet 规范的一部分,由 web 容器(如 tomcat)管理,在 servlet 容器启动时加载,不依赖 spring 框架,可独立于 spring 运行 。例如,在传统的 servlet 项目中,也可以使用过滤器进行请求处理。
拦截器(interceptor):是 spring 框架的组件,依托于 spring 容器,只有在 spring 环境下才能发挥作用。它随着 spring 容器的启动而初始化,在 spring mvc 的请求处理流程中发挥作用。
1.2 拦截范围
过滤器:可以拦截所有进入 web 容器的请求,包括静态资源(如 css、js 文件)请求和 servlet 请求。例如,对所有请求进行统一的字符编码设置,就可以使用过滤器实现。
拦截器:仅针对 spring mvc 的 controller 请求生效,对静态资源等非 controller 请求不起作用。比如,当我们只想对业务接口进行权限校验时,拦截器就更合适。
1.3 执行时机与方法
过滤器:通过实现filter接口,重写init、dofilter和destroy方法来完成功能。dofilter方法在请求到达 servlet 之前被调用,主要用于请求的预处理,如设置请求头、修改请求参数等 。
拦截器:实现handlerinterceptor接口,有三个关键方法:
prehandle:在 controller 方法调用前执行,返回true表示继续执行后续流程,返回false则中断请求 。
posthandle:在 controller 方法调用后、视图渲染前执行,可以对 modelandview 进行修改 。
aftercompletion:在整个请求完成后执行,常用于资源清理、记录日志等操作 。
1.4 功能与灵活性
过滤器:功能相对基础,主要用于处理一些通用的、与业务逻辑无关的操作,如解决跨域问题、设置请求编码格式等。
拦截器:功能更为强大和灵活,能更精细地控制请求处理流程,可在请求处理的不同阶段介入,适合处理与业务逻辑相关的操作,如权限验证、性能监控等。
二、spring 拦截器使用步骤
- 接下来,以 spring boot 项目为例,详细介绍拦截器的使用方法,并提供完整的代码示例。
2.1 创建拦截器类
- 创建一个实现handlerinterceptor接口的类,并重写三个核心方法。这里创建一个简单的权限验证拦截器authinterceptor:
//被扫描 @component public class logininterceptor implements handlerinterceptor { @override public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception { system.out.println("prehandle interceptor"); // return可返回两种值 : true 拦截放行 false 拦截不放行 //判断用户是否登录,获取session中存的会话 object username = request.getsession().getattribute("username"); //username == null 说明username未存入会话,用户没有登录 if (username != null){ system.out.println("已登录"); return true; } //向前端发出响应 response.getwriter().write("notlogin"); return false; } @override public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception { system.out.println("posthandle interceptor"); } @override public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception { system.out.println("aftercompletion interceptor"); } }
2.2 配置拦截器
- 创建一个配置类,实现webmvcconfigurer接口,重写addinterceptors方法来注册拦截器,并指定拦截路径和排除路径。
@configuration @enablewebmvc public class springmvc implements webmvcconfigurer { @autowired private logininterceptor logininterceptor; // 拦截器拦截路径和排除路径 @override public void addinterceptors(interceptorregistry registry) { registry.addinterceptor(logininterceptor).addpathpatterns("/api"); } }
2.3 测试拦截器
- 创建一个简单的 controller 用于测试拦截器的效果
@restcontroller @requestmapping("/api") public class apicontroller { @getmapping public string login() { system.out.println("controller!"); return "登录成功"; }
三、总结
过滤器和拦截器在 spring 开发中各有优势,过滤器适用于处理通用的请求处理任务,而拦截器更适合与业务逻辑紧密相关的操作。掌握它们的区别和使用方法,能帮助我们更高效地开发健壮、可维护的 web 应用。
到此这篇关于spring 框架中拦截器与过滤器的区别及拦截器使用详解的文章就介绍到这了,更多相关spring拦截器与过滤器区别内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论