springmvc(定义、配置以及执⾏流程)
⼀、概念
springmvc中的(interceptor)类似于Servlet中的过滤器(Filter),它主要⽤于拦截⽤户请求并做相应的处理。在实际项⽬中会经常使⽤到,例如在购物⽹站中通过可以拦截未登录的⽤户,禁⽌其购买商品,或者使⽤它来验证已登录⽤户是否有相应的操作权限(即权限验证),记录请求信息的⽇志等应⽤。
所谓,就是能够在进⾏某个操作之前拦截请求,如果请求符合条件就允许在往下执⾏。⽐如说,海关就是⼀个,他拦截进出⼝的货物,如果货物满⾜进出⼝条件,则放⾏,否则就拦截,退回处理。
⼆、定义和配置使⽤
在springmvc中要使⽤,就需要对类进⾏定义和配置,通常类可以通过两种⽅式来定义。
第⼀种通过实现HandleInterceptor接⼝,或者继承HandleInterceptor接⼝的实现类HandleInterceptorAdapter来定义;
第⼆种通过实现WebRequestInterceptor接⼝,或继承WebRequestInterceptor接⼝的实现类来定义。
1、的定义:以实现HandleInterceptor接⼝为例
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//做⼀些操作⽅法返回类型为布尔值
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//做⼀些操作
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//做⼀些操作
}
}
从以上可以看出,⾃定义的类实现了HandlerInterceptor接⼝,并且实现了接⼝中的三个⽅法。对这三个⽅法解释如下:springboot和过滤器
(1)、preHandle()⽅法
该⽅法会在控制器⽅法前执⾏,其返回值表⽰是否中断后续操作。当返回值为true时,表⽰继续向下执⾏;当返回值为false时,会中断后续的所有操作(包括调⽤下⼀个和控制器类中的⽅法执⾏等)。
(2)、postHandle()⽅法
该⽅法会在控制器⽅法调⽤之后,且解析视图之前执⾏。可以通过此⽅法对请求域中的模型和视图做出进⼀步的修改。
(3)、afterCompletion()⽅法
该⽅法会在整个请求完成,即视图渲染结束之后执⾏。可以通过此⽅法实现⼀些资源清理、记录⽇志信息等⼯作。
2、的配置
要使⾃定义的类⽣效,还需要在springmvc的配置⽂件中进⾏配置。配置如下所⽰:
<!-- 配置 -->
<mvc:interceptors>
<!-- 使⽤bean直接定义在<mvc:interceptors>下⾯的Interceptor将拦截所有请求 -->
<bean class="fig.AllInterceptor"/>
<!-- 1 -->
<mvc:interceptor>
<!-- 配置作⽤的路径,/**表⽰拦截所有路径 -->
<mvc:mapping path="/**"/>
<!-- 配置不需要作⽤的路径 /admin表⽰放⾏所有以/admin结尾的路径 -->
<mvc:exclude-mapping path="/admin"/>
<!-- 定义在<mvc:interceptor>下⾯的Interceptor,表⽰对匹配路径的请求才进⾏拦截 -->
<bean class="fig.AdminInterceptor"/>
</mvc:interceptor>
<!-- 2 -->
<mvc:interceptor>
<mvc:mapping path="/index/**"/>
<bean class="fig.IndexInterceptor"/>
</mvc:interceptor>
<!-- 后⾯可以配置多个-->
</mvc:interceptors>
需要注意的是在进⾏配置时,必须按照如上的顺序进⾏配置,否则将失效。
三、执⾏流程
在运⾏程序时,的执⾏是有⼀定的顺序的,该顺序与配置⽂件中所定义的的顺序是相关的。执⾏顺序有两种情况,即单个和多个的情况,单个和多个的执⾏顺序是不⼀样的,略有差别。
1、单个执⾏流程
当只定义了⼀个时,它的执⾏流程如下图所⽰:
对单个执⾏流程解释如下:
从以上图中可以看出,程序⾸先会执⾏类中的preHandle()⽅法,如果该⽅法返回true,则程序会继续向下执⾏处理器中的⽅法,否则程序将不再往下继续执⾏。在业务处理器(即控制器Controller类)处理完请求后,会执⾏postHandle()⽅法,然后会通过DispatcherServlet 向客户端返回响应,在DispatcherServlet处理完请求后,才会执⾏afterCompletion()⽅法。
因此单个的执⾏流程:
prehandle()——Handle(也就是控制器⾥的⽅法)——postHandle()——afterCompletion()。
2、多个执⾏流程
在⼤型的企业级项⽬中,通常会配置多个来实现不同的功能。例如在springmvc配置⽂件中配置了两个Interceptor1和Interceptor2。配置顺序Interceptor1在Interceptor2的前⾯。
则它们的执⾏流程如下图所⽰:
从以上执⾏流程图中可以看出,当有多个同时⼯作时,它们的preHandle()⽅法会按照配置⽂件中的配置顺序执⾏,⽽它们的postHandle()和afterCompletion()⽅法则会按照配置顺序的反序执⾏。
因此当多个⼯作时,其执⾏流程:
preHandle1——preHandle2——Handle——postHandle2——postHandle1——afterCompletion2——afterCompletion1··········
多个存在时,其preHandle⽅法是按次序执⾏,其余的则是相反顺序执⾏。