热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot之Interceptor拦截器注入使用

相关文章:SpringBoot之AOP切面的使用SpringBoot之Listener注册到Spring容器中的多种方法SpringBoot之Filter过滤器的实现

相关文章:
SpringBoot 之AOP切面的使用
SpringBoot之Listener注册到Spring容器中的多种方法
SpringBoot之Filter过滤器的实现及排序问题
SpringBoot 之多个过滤器(Filter) ,监听器(Listener),切面(AOP),拦截器(Interceptor)的指定排序问题总结篇



springboot中实现拦截器方式


实现方式

实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter 抽象类


两者区别

HandlerInterceptorAdapter 实现AsyncHandlerInterceptor接口,AsyncHandlerInterceptor接口 继承HandlerInterceptor接口。AsyncHandlerInterceptor接口多了一个afterConcurrentHandlingStarted方法


创建一个拦截器实现HandlerInterceptor接口

在jdk1.8之后,只需要实现自己需要的方法。因为接口有默认实现。

@Component
public class LoginInterceptor implements HandlerInterceptor {/*** 预处理回调方法,实现处理器的预处理* 返回值:true表示继续流程;false表示流程中断,不会继续调用其他的拦截器或处理器*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("方法开始前拦截.........");//业务代码 返回false或者truereturn false;}/*** 后处理回调方法,实现处理器(controller)的后处理,但在渲染视图之前* 此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("方法返回后拦截.........");}/*** 整个请求处理完毕回调方法,即在视图渲染完毕时回调,* 如性能监控中我们可以在此记录结束时间并输出消耗时间,* 还可以进行一些资源清理,类似于try-catch-finally中的finally,* 但仅调用处理器执行链中*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("方法结束后拦截.........");}
}

创建一个拦截器继承HandlerInterceptorAdapter类

@Component
public class LoginInterceptor implements HandlerInterceptor {/*** 预处理回调方法,实现处理器的预处理* 返回值:true表示继续流程;false表示流程中断,不会继续调用其他的拦截器或处理器*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("方法开始前拦截.........");//业务代码 返回false或者truereturn false;}/*** 后处理回调方法,实现处理器(controller)的后处理,但在渲染视图之前* 此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println("方法返回后拦截.........");}/*** 整个请求处理完毕回调方法,即在视图渲染完毕时回调,* 如性能监控中我们可以在此记录结束时间并输出消耗时间,* 还可以进行一些资源清理,类似于try-catch-finally中的finally,* 但仅调用处理器执行链中*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println("方法结束后拦截.........");}/*** 如果返回一个current类型的变量,会启用一个新的线程。执行完preHandle方法之后立即会调用afterConcurrentHandlingStarted,然后新线程再以次执行*/@Overridepublic void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("do something.........");super.afterConcurrentHandlingStarted(request, response, handler);}
}

创建配置类来管理拦截器,并将之前的拦截器注入其中

两种方式,实现 WebMvcConfigurer 或者继承 WebMvcConfigurationSupport 两者没什么区别,看项目的选择。

@Configuration
public class MvcInterceptorConfig extends WebMvcConfigurationSupport {@Autowiredprivate LoginInterceptor loginInterceptor;@Overrideprotected void addInterceptors(InterceptorRegistry registry) {// 多个拦截器组成一个拦截器链// addPathPatterns 用于添加拦截规则,/**表示拦截所有请求// excludePathPatterns 用户排除拦截registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/stuInfo/getAllStuInfoA","/account/register"); }
}

多个拦截器执行顺序

多个拦截器的执行顺序按照你的代码代码添加顺序,先添加后执行。


在未设置order方法值时:

registry.addInterceptor(repeatPutInterceptor) // 1
registry.addInterceptor(refererInterceptor) // 2
registry.addInterceptor(loginAuthInterceptor) //3

针对于preHandle 执行顺序为:1->2->3
针对于postHandle执行顺序为:3->2->1
针对于afterCompletion执行顺序为:3->2->1


设置order值时:此时能实现自定义顺序

registry.addInterceptor(repeatPutInterceptor).order(1) // 1
registry.addInterceptor(loginAuthInterceptor).order(3) //2
registry.addInterceptor(refererInterceptor).order(2) // 3

针对于preHandle 执行顺序为:1->3->2
针对于postHandle执行顺序为:2->3->1
针对于afterCompletion执行顺序为:2->3->1


源码出处:InterceptorRegistry类

protected List<Object> getInterceptors() {return this.registrations.stream().sorted(INTERCEPTOR_ORDER_COMPARATOR).map(InterceptorRegistration::getInterceptor).collect(Collectors.toList());
}
private static final Comparator<Object> INTERCEPTOR_ORDER_COMPARATOR &#61;OrderComparator.INSTANCE.withSourceProvider(object -> {if (object instanceof InterceptorRegistration) {return (Ordered) ((InterceptorRegistration) object)::getOrder;}return null;});

排序问题

添加&#64;order注解&#xff0c;和实现Ordered 接口都无法实现自定义顺序的。只能在配置类中注入拦截器的时候添加order或者使用代码顺序来自定义排序


推荐阅读
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
author-avatar
Melody-Zhu1988
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有