SpringBoot拦截器怎么用
SpringBoot拦截器怎么用
今天小编给大家分享一下SpringBoot拦截器怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
HandlerInterceptor 详解
HandlerInterceptor
允许定制handler
处理器执行链的工作流接口。我们可以自定义拦截器用于拦截 handlers 处理器(你可以理解为 controller 层的接口),从而可以添加一些共同的重复性的处理行为(例如接口鉴权,接口日志记录,性能监控等),而不用修改每一个 handler 的实现。
注意,此基于SpringBoot 2.3.12.RELEASE
版本讲解。
HandlerInterceptor 接口只有三个默认空实现方法,在低版本中这三个方法不是默认方法,而是抽象方法。
publicinterfaceHandlerInterceptor{defaultbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{returntrue;}defaultvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,@NullableModelAndViewmodelAndView)throwsException{}defaultvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,@NullableExceptionex)throwsException{}}
这三个方法的执行顺序图如下:
preHandle
preHandle
前置处理,拦截一个处理器(handler)的执行,preHandle 方法会在HandlerMapping
确定一个适当的处理器对象之后,但在HandlerAdapter
调用处理器之前被调用。可以简单理解为 controller 接口被调用之前执行。
Intercepter 是链式的,就是一个接着一个执行。如果此方法返回 true,则会执行下一个拦截器或者直接执行处理器。如果此方法返回 false 或者抛出异常则终止执行链,也不再调用处理器。
注意,此方法如果不返回 true,那么postHandle
和afterCompletion
不会被执行。
那这个方法有什么用呢?其实可以做一些接口被调用前的预处理,例如用户权限校验。
packagecom.chenpi;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.lang.Nullable;importorg.springframework.stereotype.Component;importorg.springframework.web.method.HandlerMethod;importorg.springframework.web.servlet.HandlerInterceptor;/***@Description用户权限验证拦截*@Author陈皮*@Date2021/6/27*@Version1.0*/@ComponentpublicclassUserPermissionInterceptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler){if(handlerinstanceofHandlerMethod){HandlerMethodhandlerMethod=(HandlerMethod)handler;//获取用户权限校验注解UserAuthenticateuserAuthenticate=handlerMethod.getMethod().getAnnotation(UserAuthenticate.class);if(null==userAuthenticate){userAuthenticate=handlerMethod.getMethod().getDeclaringClass().getAnnotation(UserAuthenticate.class);}if(userAuthenticate!=null&&userAuthenticate.permission()){//验证用户信息UserContextuserContext=userContextManager.getUserContext(request);if(null==userContext){returnfalse;}}}returntrue;}}
postHandle
postHandle
后置处理,会在HandlerAdapter
调用处理器之后,但在DispatcherServlet
渲染视图之前被调用。可以在此对ModelAndView
做一些额外的处理。可以简单理解为 controller 接口被调用之后执行。
注意,此方法在执行链中的执行顺序是倒着执行的,即先声明的拦截器后执行。
afterCompletion
afterCompletion 完成之后,在请求处理完之后被执行,也就是渲染完视图之后。一般用于做一些资源的清理工作,配合 preHandle 计算接口执行时间等。
注意,和 postHandle 一样,此方法在执行链中的执行顺序也是倒着执行的,即先声明的拦截器后执行。
@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,@NullableExceptionex){//请求完后,清除当前线程的用户信息UserContextHolder.removeUserContext();}
注册拦截器
注意,我们自定义的拦截器要通过WebMvcConfigurer
的实现类进行注册,才能生效。
packagecom.yzj.ehr.common.config;importcom.yzj.ehr.common.context.UserContextResolver;importorg.springframework.stereotype.Component;importorg.springframework.web.method.support.HandlerMethodArgumentResolver;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;importcom.yzj.ehr.common.interceptor.UserPermissionInterceptor;/***@Description注册拦截器*@Author陈皮*@Date2021/6/27*@Version1.0*/@ComponentpublicclassWebAppConfigurerimplementsWebMvcConfigurer{privateUserPermissionInterceptoruserPermissionInterceptor;publicWebAppConfigurer(finalUserPermissionInterceptoruserPermissionInterceptor){this.userPermissionInterceptor=userPermissionInterceptor;}@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){//匹配所有接口,排除/base/test接口registry.addInterceptor(userPermissionInterceptor).addPathPatterns("/**").excludePathPatterns("/base/test");}}
以上就是“SpringBoot拦截器怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注恰卡编程网行业资讯频道。
推荐阅读
-
vue动态添加删除输入框(springboot vue怎么让数据库显示出来)
springbootvue怎么让数据库显示出来?一般情况下是前端调阅后端接口,来获取到数据库的数据,后端哪里会把数据库的数据整理...
-
springboot实现基于aop的切面日志
本文实例为大家分享了springboot实现基于aop的切面日志的具体代码,供大家参考,具体内容如下通过aop的切面方式实现日志...
-
SpringBoot定时任务功能怎么实现
-
SpringBoot中的@Import注解怎么使用
-
SpringBoot整合Lombok及常见问题怎么解决
-
springboot图片验证码功能模块怎么实现
-
Springboot+SpringSecurity怎么实现图片验证码登录
-
SpringBoot注解的知识点有哪些
SpringBoot注解的知识点有哪些这篇“SpringBoot注...
-
SpringBoot2.x中management.security.enabled=false无效怎么解决
-
springboot怎么禁用某项健康检查
springboot怎么禁用某项健康检查今天小编给大家分享一下sp...