spring 拦截器执行顺序,springmvc 配置拦截器

  spring 拦截器执行顺序,springmvc 配置拦截器

  

目录

春季手动音量调节拦截器介绍一、创建拦截器二、配置拦截器设置不需要拦截的请求三、多个拦截器的执行顺序

 

  

SpringMVC拦截器介绍

春季手动音量调节中的拦截器用于拦截控制器方法的执行。

 

  先创建出前置需要的一些条件:

  a th : href= @ {/test interceptor } rel= external no follow 测试拦截器/a后端:

  @ controller公共类测试控制器{ @请求映射(/test interceptor )公共字符串测试拦截器(){返回“成功”;}}

  

一、创建拦截器

新建一个包拦截器,在下面创建一个拦截器第一截击机,并且要实现拦截器接口。

 

  快捷键Ctrl O,快速重写方法,图示里的3 个。

  公共类第一截击机实现处理程序拦截器{公共布尔前置句柄(http servlet请求请求,HttpServletResponse响应,对象处理程序)抛出异常{系统。出去。println(第一个拦截器-前置句柄);返回false}公共void post句柄(http servlet请求请求,HttpServletResponse响应,对象处理程序,ModelAndView modelAndView)抛出异常{系统。出去。println(第一个拦截器-post句柄);}完成后public void(http servlet请求请求,HttpServletResponse响应,对象处理程序例外情况)抛出异常{系统。出去。println(第一个拦截器-完成后);}}preHandle:在当前控制器方法执行之前执行。

  postHandle:在当前控制器方法执行之后执行。

  完工后:处理完视图和模型数据,渲染视图完毕之后执行。

  

二、配置拦截器

在学习笔记一配置文件里配置拦截器,对象就是第一截击机类:

 

  !- 配置拦截器详细说明:MVC :拦截器。平果。MVC。截击机。第一个拦截器/bean/MVC :拦截器重新部署,访问http://localhost :8080/spring MVC/,发现页面空白,查看控制器日志看到有打印:

  说明拦截成功。

  看下上面重新的三个方法中,只有预处理有返回值,是个布尔类型:错误表示拦截,真的表示放行。

  修改上面预处理的返回为没错,重新部署后再次访问首页,可以访问成功。

  查看控制台打印输出,看到在渲染之前,前面注射毒品个方法执行了:前置处理、后置处理.

  在非常多的百里香叶渲染之后,最后一个完工后也执行了。

  :center">

  现在继续点击首页里的新加的超链接,发现也会被拦截放行。

  

 

  说明这种配置方式,会拦截所有的请求。

  

 

  

设置不需要拦截的请求

可以通过 ref 或 bean 标签设置拦截器:

 

  通过mvc:mapping设置需要拦截的请求通过mvc:exclude-mapping设置需要排除的请求

<bean name="firstInterceptor" class="com.pingguo.mvc.interceptors.FirstInterceptor"></bean> <!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/"></mvc:exclude-mapping> <ref bean="firstInterceptor"></ref> </mvc:interceptor> </mvc:interceptors>

注意这里我在外部注册了一个 bean 叫 firstInterceptor,以便 ref 引用。

 

  <mvc:mapping path="/**"/>,表示拦截所有请求。<mvc:exclude-mapping path="/">,表示除了首页不拦截。也就是说,现在我访问http://localhost:8080/springmvc/的时候,应该不拦截。

  访问http://localhost:8080/springmvc/testInterceptor就会拦截了。

  试一下,先访问 http://localhost:8080/springmvc/:

  可以正常打开首页,并且控制台也没有输出拦截器里的内容:

  

 

  现在继续访问 http://localhost:8080/springmvc/testInterceptor,

  

 

  拦截了。

  

 

  

三、多个拦截器的执行顺序

继续新建一个拦截器SecondInterceptor,注意这次我加了 @Component,方便在配置文件中直接ref引用使用。

 

  

@Componentpublic class SecondInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("SecondInterceptor --> preHandle"); return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("SecondInterceptor --> postHandle"); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("SecondInterceptor --> afterCompletion"); }}

修改拦截器配置:

 

  

<!-- 配置拦截器 --> <mvc:interceptors> <ref bean="firstInterceptor"></ref> <ref bean="secondInterceptor"></ref> </mvc:interceptors>

重新部署,访问下首页http://localhost:8080/springmvc/,查看控制台打印输出。

 

  

 

  可以发现,preHandle 方法执行的顺序是 FirstInterceptor->SecondInterceptor。其他 2 个方法则是顺序倒过来。

  若每个拦截器的 preHandle()都返回 true:

  执行顺序跟配置里的顺序有关,在上面拦截器里 firstInterceptor 就是在 secondInterceptor前面。preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()`会按照配置的反序执行。若某个拦截器的preHandle()返回了false:

  preHandle()返回false和它之前的拦截器的preHandle()都会执行。postHandle()都不执行。返回false的拦截器之前的拦截器的afterComplation()会执行。试一下,把 SecondInterceptor 中的preHandle()修改返回 false,再次请求下首页:

  

 

  符合预期。

  这些过程可以打断点看下源码的执行过程。

  以上就是SpringMVC拦截器创建配置及执行顺序的详细内容,更多关于SpringMVC拦截器配置的资料请关注盛行IT其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: