首页 > 作文

springboot自定义拦截器的方法

更新时间:2023-04-04 13:06:42 阅读: 评论:0

拦截器应该分属于web框架的组件,每个框架提供的自己的支持,实现方式也就不同。例如struts和spring,以下是spring 的拦截器总结,它是基于动态代理(反射)实现的。

spring 中声明拦截器需要实现 handlerinterceptor 接口,当然也可以通过继承handlerinterceptoradapter 抽象类,handlerinterceptoradapter也是实现了什么是海啸handlerinterceptor 接口。

拦截器中有四个方法:

prehandle:在controller中的方法之前执行,决定是否放行,return true表示放行。一旦放行其对应的aftercompletion就一定会执行。

posthandle:controller中的方法处理完之后,dispatcherr陕西考试vlet进行视图的渲染之前,也就是说在这个方法中你可以对modelandview进行操作

aftercompletion:dispatcherrvlet进行视图的渲染之后

afterconcurrenthandlingstarted:与异步相关

下面通过代码实践,备注了是否放行和异常对拦截器内方法执行的影响结论。其实只需对方法执行的时机进行分析,我们就可以得出相同的结论。

如果想深入了解每个方法的执行时机,可以阅读springmvc的 dispatcherrvlet 源码

@componentpublic class interceptortwo extends handlerinterceptoradapter {  /**  * handler 对应@requestmapping对应的controller对象  */  @override  public boolean prehandle(httprvletrequest request, httprvletrespon respon, object handler) throws exception {    //这里我们是没办法拿到方法参数的,parameters是空的,但是可以拿到controller种注入的bean    //可以断点验证    handlermethod handlermethod = (handlermethod)handler;    methodparameter [] parameters 兴趣爱好怎么写= handlermethod.getmethodparameters();    return true;//放行  }  @override  public void posthandle(httprvletrequest request, httprvletrespon respon, object handler, modelandview modelandview) throws exception {    //在拦截器链中,只要有一个不放行的,所有的posthandle都不会执行    //如果controller方法抛异常了,所有的posthandle也不会执行    system.out.println("posthandle");  }  @override  public void aftercompletion(httprvletrequest request, httprvletrespons姹紫嫣红意思e respon, object handler, exception ex) throws exception {    //只要对应的prehandle放行了就一定会执行,controller方法抛异常也不会影响    system.out.println("aftercompletion");  }  @override  public void afterconcurrenthandlingstarted(httprvletrequest request, httprvletrespon respon, object handler) throws exception {    system.out.println("afterconcurrenthandlingstarted");  }}

使拦截器生效

//springboot 是1.x版本的项目中是extends webmvcconfigureradapter ,代码也是一样的@configurationpublic class interceptorconfig implements webmvcconfigurer {  @autowired  private sourceaccessinterceptor interceptor;  @autowired  private interceptorone interceptorone;  @override  public void addinterceptors(interceptorregistry interceptorregistry) {    //1.加入的顺序就是拦截器执行的顺序,设置@order也不会影响    //2.按顺序执行所有拦截器的prehandle    //3.所有的prehandle 执行完再反向执行全部posthandle 最后是反向执行aftercompletion,    //如果其中有一个未放行,或者抛异常了会影响执行顺序吗?怎样影响    interceptorregistry.addinterceptor(interceptor).addpathpatterns("/**");    interceptorregistry.addinterceptor(interceptorone);  }}

应用示例

这个拦截器是用来拦截请求是否有携带token的,如果请求未携带token,将会302重定向到登录界面。

@componentpublic class authinterceptor extends handlerinterceptoradapter {  @autowired  private jwtutil jwtutil;  @value("${login.url}")  private string loginurl;  /**  * 验证access_token  *  * @param re我家的小狗100字quest 请求  * @param respon 响应  * @param handler 处理器controller  */  @override  public boolean prehandle(httprvletrequest request, httprvletrespon respon, object handler) throws exception {    handlermethod handlermethod = (handlermethod) handler;    //withouttoken是我自定义的注解,标注在方法上,表示不需要验证token    if (handlermethod.getmethod().isannotationprent(withouttoken.class)) {      //不需要验证token      return true;    } el {      try {        //校验jwt        string access_token = request.getheader("access_token");        jwtutil.verifiertoken(access_token);        //获取用户信息        final string account = jwtutil.getaccount(access_token);        //todo 可以在这里查询用户信息,然后将用户信息设置到线程变量             } catch (nullpointerexception | jwtverificationexception e) {        //todo 重定向到登陆页        respon.ndredirect(loginurl);        return fal;      }      return true;    }  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。

本文发布于:2023-04-04 13:06:41,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/e58fcec04da528729a90339493f3830b.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:springboot自定义拦截器的方法.doc

本文 PDF 下载地址:springboot自定义拦截器的方法.pdf

标签:方法   拦截器   顺序   异常
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图