Spring Boot拦截器使用

来源:互联网 发布:vue.js验证手机号码 编辑:程序博客网 时间:2024/05/19 17:58

在Web开发中,拦截器(Interceptor)可以用来验证是否登录、预先设置数据以及统计方法的执行效率等。


Spring中的拦截器分两种,一是HandlerInterceptor,另一个是MethodInterceptor。这里主要说以下HandlerInterceptor。


HandlerInterceptor是SpringMVC项目中的拦截器,拦截目标是请求的地址,比MethodInterceptor先执行。实现一个HandlerInterceptor拦截器可以直接实现该接口,也可以继承HandlerInterceptorAdapter类。


SpringMVC处理请求的整个过程是先根据请求找到对应的HandlerExecutionChain,它包含了处理请求的handler和所有的HandlerInterceptor拦截器;然后在调用hander之前分别调用每个HandlerInterceptor拦截器的preHandle方法,若有一个拦截器返回false,则会调用triggerAfterCompletion方法,并且立即返回不再往下执行;若所有的拦截器全部返回true并且没有出现异常,则调用handler返回ModelAndView对象;再然后分别调用每个拦截器的postHandle方法;最后,即使是之前的步骤抛出了异常,也会执行triggerAfterCompletion方法。


下面详细介绍一下需要Override的三种方法:

(1 )preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法,该方法将在请求处理之前进行调用。SpringMVC 中的Interceptor 是链式调用的,在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。


   (2 )postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法,这个方法包括后面要说到的afterCompletion 方法都只能是在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。postHandle 方法,是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行。


   (3 )afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法,该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。


在Spring Boot中配置拦截器,需要写一个配置类继承WebMvcConfigurerAdapter类并添加该拦截器。

@Componentpublic class XdtoutiaoWebConfiguration extends WebMvcConfigurerAdapter {    @Autowired    PassportInterceptor passportInterceptor;    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(passportInterceptor);        super.addInterceptors(registry);    }}




参考资料:

http://blog.csdn.net/hongxingxiaonan/article/details/48090075

http://www.cnblogs.com/yadongliang/p/7800775.html


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 隐形日抛 年抛是什么意思 日抛型 博士伦日抛30片 日抛隐形 日抛隐形眼镜哪个好 隐形眼镜日抛哪个好 隐形眼镜日抛好吗 日抛型隐形眼镜 隐形眼镜日抛多钱 日抛眼镜 海昌日抛 隐形眼镜日抛好还是年抛好 隐形眼镜日抛 价格 海昌日抛价格 隐形眼镜日抛大概多少钱 隐形眼镜日抛月抛什么意思 隐形眼镜日抛好不好 隐形眼镜日抛月抛年抛哪个好 日抛眼镜多少钱 日抛美瞳大概多少钱 日抛型隐形眼镜价格 隐形眼镜日抛好么 隐形眼镜日抛月抛区别 博士伦日抛和强生日抛哪个好 日抛美瞳价格 隐形眼镜月抛好还是日抛好 隐形眼镜日抛 月抛 隐形眼镜日抛型价格 日抛隐形眼镜怎么戴 博士伦清朗日抛 隐形眼镜 日抛 月抛 日抛隐形眼镜需要护理液吗 日抛美瞳可以带两天吗 日抛隐形眼镜一般多少钱 清朗日抛 日抛和月抛 博士伦日抛美瞳 隐形眼镜月抛和日抛 隐形眼镜 日抛月抛 隐形眼镜 日抛型