纠纷奇闻作文社交美文家庭
聚热点
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

SpringBoot项目鉴权的4种方法

1月1日 眸中星投稿
  文章介绍了springboot中实现通用auth的四种方式,包括传统AOP、拦截器、参数解析器和过滤器,并提供了对应的实例代码,最后简单总结了下他们的执行顺序。
  前言
  最近一直被无尽的业务需求淹没,没时间喘息,终于接到一个能让我突破代码舒适区的活儿,解决它的过程非常曲折,一度让我怀疑人生,不过收获也很大,代码方面不明显,但感觉自己抹掉了java、Tomcat、Spring一直挡在我眼前的一层纱。对它们的理解上了一个新的层次。好久没输出了,于是挑一个方面总结一下,希望在梳理过程中再了解一些其他的东西。
  由于Java繁荣的生态,下面每一个模块都有大量的文章专门讲述。所以我选了另外一个角度,从实际问题出发,将这些分散的知识串联起来,各位可以作为一个综述来看。各个模块的极致详细介绍,大家可以去翻官方文档或看网络上的其他博客。需求很简单清晰,跟产品们提的妖艳需求一点也不一样:在我们的web框架里添加一个通用的appkey白名单校验功能,希望它的扩展性更好一些。
  这个web框架是部门前驱者基于springboot实现的,介于业务和Spring框架之间,做一些偏向于业务的通用性功能,如日志输出、功能开关、通用参数解析等。平常是对业务透明的,最近一直忙于把需求做好,代码写好,甚至从没注意过它的存在。
  传统AOP
  对于这种需求,首先想到的当然是Springboot提供的AOP接口,只需要在Controller方法前添加切点,然后再对切点进行处理即可。
  实现
  其使用步骤如下:使用Aspect声明一下切面类WhitelistA在切面类内添加一个切点whitelistPointcut(),为了实现此切点灵活可装配的能力,这里不使用execution全部拦截,而是添加一个注解Whitelist,被注解的方法才会校验白名单。在切面类中使用spring的AOP注解Before声明一个通知方法checkWhitelist()在Controller方法被执行之前校验白名单。
  切面类伪代码如下:AspectpublicclassWhitelistAspect{Before(valuewhitelistPointcut()annotation(whitelist))publicvoidcheckAppkeyWhitelist(JoinPointjoinPoint,Whitelistwhitelist){checkWhitelist();可使用joinPoint。getArgs()获取Controller方法的参数可以使用whitelist变量获取注解参数}Pointcut(annotation(com。zhenbianshu。Whitelist))publicvoidwhitelistPointCut(){}}
  在Controller方法上添加Whitelist注解实现功能。
  扩展
  本例中使用了注解来声明切点,并且我实现了通过注解参数来声明要校验的白名单,如果之后还需要添加其他白名单的话,如通过UID来校验,则可以为此注解添加uid()等方法,实现自定义校验。此外,spring的AOP还支持execution(执行方法)、bean(匹配特定名称的Bean对象的执行方法)等切点声明方法和Around(在目标函数执行中执行)、After(方法执行后)等通知方法。如此,功能已经实现了,但领导并不满意,原因是项目中AOP用得太多了,都用滥了,建议我换一种方式。嗯,只好搞起。
  Interceptor
  Spring的拦截器(Interceptor)实现这个功能也非常合适。顾名思义,拦截器用于在Controller内Action被执行前通过一些参数判断是否要执行此方法,要实现一个拦截器,可以实现Spring的HandlerInterceptor接口。
  实现
  实现步骤如下:定义拦截器类AppkeyInterceptor类并实现HandlerInterceptor接口。实现其preHandle()方法;在preHandle方法内通过注解和参数判断是否需要拦截请求,拦截请求时接口返回在自定义的WebMvcConfigurerAdapter类内注册此拦截器;
  AppkeyInterceptor类如下:ComponentpublicclassWhitelistInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{Whitelistwhitelist((HandlerMethod)handler)。getMethodAnnotation(Whitelist。class);whitelist。values();通过request获取请求参数,通过whitelist变量获取注解参数}OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{方法在Controller方法执行结束后执行}OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{在view视图渲染完成后执行}}
  扩展
  要启用拦截器还要显式配置它启用,这里我们使用WebMvcConfigurerAdapter对它进行配置。需要注意,继承它的的MvcConfiguration需要在ComponentScan路径下。ConfigurationpublicclassMvcConfigurationextendsWebMvcConfigurerAdapter{OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry。addInterceptor(newWhitelistInterceptor())。addPathPatterns()。order(1);这里可以配置拦截器启用的path的顺序,在有多个拦截器存在时,任一拦截器返回false都会使后续的请求方法不再执行}}
  还需要注意,拦截器执行成功后响应码为200,但响应数据为空。
  当使用拦截器实现功能后,领导终于祭出大招了:我们已经有一个Auth参数了,appkey可以从Auth参数里取到,可以把在不在白名单作为Auth的一种方式,为什么不在Auth时校验?emmm吐血中。
  如果您正在学习SpringBoot,那么推荐一个连载多年还在继续更新的免费教程:http:blog。didispace。comspringbootlearning2x
  ArgumentResolver
  参数解析器是Spring提供的用于解析自定义参数的工具,我们常用的RequestParam注解就有它的影子,使用它,我们可以将参数在进入ControllerAction之前就组合成我们想要的样子。Spring会维护一个ResolverList,在请求到达时,Spring发现有自定义类型参数(非基本类型),会依次尝试这些Resolver,直到有一个Resolver能解析需要的参数。要实现一个参数解析器,需要实现HandlerMethodArgumentResolver接口。
  实现定义自定义参数类型AuthParam,类内有appkey相关字段;定义AuthParamResolver并实现HandlerMethodArgumentResolver接口;实现supportsParameter()接口方法将AuthParam与AuthParamResolver适配起来;实现resolveArgument()接口方法解析reqest对象生成AuthParam对象,并在此校验AuthParam,确认appkey是否在白名单内;在ControllerAction方法上签名内添加AuthParam参数以启用此R
  实现的AuthParamResolver类如下:ComponentpublicclassAuthParamResolverimplementsHandlerMethodArgumentResolver{OverridepublicbooleansupportsParameter(MethodParameterparameter){returnparameter。getParameterType()。equals(AuthParam。class);}OverridepublicObjectresolveArgument(MethodParameterparameter,ModelAndViewContainermavContainer,NativeWebRequestwebRequest,WebDataBinderFactorybinderFactory)throwsException{Whitelistwhitelistparameter。getMethodAnnotation(Whitelist。class);通过webRequest和whitelist校验白名单returnnewAuthParam();}}
  扩展
  当然,使用参数解析器也需要单独配置,我们同样在WebMvcConfigurerAdapter内配置:ConfigurationpublicclassMvcConfigurationextendsWebMvcConfigurerAdapter{OverridepublicvoidaddArgumentResolvers(ListHandlerMethodArgumentResolverargumentResolvers){argumentResolvers。add(newAuthParamResolver());}}
  这次实现完了,我还有些不放心,于是在网上查找是否还有其他方式可以实现此功能,发现常见的还有Filter。
  Filter
  Filter并不是Spring提供的,它是在Servlet规范中定义的,是Servlet容器支持的。被Filter过滤的请求,不会派发到Spring容器中。它的实现也比较简单,实现javax。servlet。Filter接口即可。由于不在Spring容器中,Filter获取不到Spring容器的资源,只能使用原生Java的ServletRequest和ServletResponse来获取请求参数。另外,在一个Filter中要显示调用FilterChain的doFilter方法,不然认为请求被拦截。实现类似:publicclassWhitelistFilterimplementsjavax。servlet。Filter{Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{初始化后被调用一次}OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{判断是否需要拦截chain。doFilter(request,response);请求通过要显示调用}Overridepublicvoiddestroy(){被销毁时调用一次}}
  扩展
  Filter也需要显示配置:ConfigurationpublicclassFilterConfiguration{BeanpublicFilterRegistrationBeansomeFilterRegistration(){FilterRegistrationBeanregistrationnewFilterRegistrationBean();registration。setFilter(newWhitelistFilter());registration。addUrlPatterns();registration。setName(whitelistFilter);registration。setOrder(1);设置过滤器被调用的顺序}}
  小结
  四种实现方式都有其适合的场景,那么它们之间的调用顺序如何呢?Filter是Servlet实现的,自然是最先被调用,后续被调用的是Interceptor被拦截了自然不需要后续再进行处理,然后是参数解析器,最后才是切面的切点。
投诉 评论 转载

skynet源码阅读系列01从main函数开始skynet是C语言写的框架,我们采用学习过程中最基本的方式去阅读skynet,从C语言的main函数开始。首先我们找到框架的入口main函数,在skynetskynet……关于高中地理教学案例的开发策略的论文摘要:高中地理教学的案例就是将一些地理理论和解释该理论的方法相结合的具体事例。在本文中,详细介绍了地理教学案例的开发概述、高中地理教学案例开发的理论依据及其开发原则、最后是高中……老大哥地位动摇?华为被花粉放弃,其中的原因有何?物价不断增长的时代,手机却越来越廉价,更换频率极高,这都得益于通信设备的飞速发展。作为国产手机老大哥的华为,地位一直无法撼动,但也遇到了发展瓶颈。不少曾经的花粉脱粉,投入了其他……提高员工激励机制有效性的途径论文摘要:本文总结了公司激励机制中好的做法,如建立分级绩效管理体系,实施绩效岗薪制,建立分层分类的核心员工职业发展通道。提出了有效激励的几点想法,主要是扩大绩效管理对员工激励的影响……信息技术学科论文导语:现在的教学越来越强调从学生的主体性出发,就是要尊重学生的个性,以下是小编为大家整理的信息技术学科论文,欢迎大家阅读与借鉴!信息技术学科论文随着电脑在家庭的普及,大部……小型水利工程施工现场管理研究论文摘要:在经济快速发展的今天,水利工程的建设不断增加,特别是小型水利工程。基于此,讨论小型水利工程施工现场管理,并提出合理化建议。关键词:小型水利工程;施工;管理1小……非智力因素在体育教学中的影响的论文摘要:掌握知识技能是智力因素和非智力因素共同参与的结果。体育教学中的非智力因素主要是指学生从事体育教学活动时,智力以外的全部因素的总合。非智力因素对发展学生的运动能力,巩固教学……想要自学英语,有哪些好的英语学习软件推荐?首先我告诉你一个最简单、也是最快自学即可学会一门语言的工具。然后我从英语的听说读写提供一整套的解决方案。00、自学英语利器是时候祭出我珍藏多年的语言学习利器罗塞塔石……SpringBoot项目鉴权的4种方法文章介绍了springboot中实现通用auth的四种方式,包括传统AOP、拦截器、参数解析器和过滤器,并提供了对应的实例代码,最后简单总结了下他们的执行顺序。前言……名门修谱春节寻根,让牛年过得更有年味春节春节作为中国的传统大节日,可以说是中华优秀传统文化的重要承载。很多人到了这一天,会挂灯笼、写对联、贴福字,拍张全家福来凸显合家团聚的开心场景,对于一些在外地工作了一年……暗网一个恐怖到让你无法想象的网络世界什么是暗网:暗网是指隐藏的网络,普通网民无法通过常规手段搜索访问,需要使用一些特定的软件、配置或者授权等才能登录。我们日常所使用的互联网仅仅是冰山一角,其他还没有被传统搜……请简述一下RS485通讯连接方式及其应用?请简述一下RS485通讯连接方式及其应用?RS485通讯采用差分信号负逻辑控制模式,其接线方式主要有两线制和四线制两种。虽然有两种接线方式,但现在用的较多的还是两线制接线……
智能手机发热的原因和正确的处理方法意想不到的惊喜又来了荣耀50系列或最高支持100W快充电脑打不开图片?别着急,教你一招轻松解决家庭影院的高速公路奥勒巴赫4KHDMI线缆中国经济一季报亮点创新发展势头不减外汇交易的最佳回报风险比例是多少?16999元!索尼a7IV发布又一312亿女巨骗神秘失踪!传销达到67000层级,中国受害今夕何夕即将开播,孙怡金瀚虐恋不输东宫网约车平台大量补充运力,一汽奔腾NAT或成黑马手机存储系统家居进行巧收纳,瞬间告别脏乱差
要让宝贝鹤立鸡群,请看5个长个小窍门第一课ampnbspampnbspampnbsp美好生活的向与君初相识纪云禾变九尾狐,顺德也变成半仙半妖,她是啥妖?电压力锅维修(电压力锅的常见故障检修)树叶儿鸟如何进行电气仪表安装工程造价控制人生若只如初见何红雨作品写给H的信老婆和老板不予执行仲裁申请书怎么撰写?近朱造句用近朱造句大全国家公务员考试行测分值分布

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形