Spring MVC 装配拦截器

当收到请求时,DispatcherServlet 将请求交给处理器映射(HandlerMapping),让它找出对应该请求的 HandlerExecutionChain 对象。在讲解 HandlerMapping 之前,有必要认识一下这个 HandlerExecutionChain 对象。

HandlerExecutionChain 顾名思义是一个执行链,它包含一个处理该请求的处理器(Handler),同时包括若干个对该请求实施拦截的拦截器(HandlerInterceptor)。当 HandlerMapping 返回 HandlerExecutionChain 后,DispatcherServlet 将请求交给定义在 HandlerExecutionChain 中的拦截器和处理器一并处理。

HandlerExecutionChain 是负责处理请求并返回 ModelAndView 的处理执行链,其结构如下图所示。请求在被 Handler 执行的前后,链中装配的 Handlerlnterceptor 会实施拦截操作。

拦截器到底做了什么事情?我们通过考查拦截器的几个接口方法进行了解。
1)boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler):在请求到达 Handler 之前,先执行这个前置处理方法。当该方法返回 false 时,请求直接返回,不会传递到链中的下一个拦截器,更不会传递到处理器链末端的 Handler 中。只有返回 true 时,请求才向链中的下一个处理节点传递。

2)void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView modelAndView):在请求被 HandlerAdapter 执行后,执行这个后置处理方法。

3)void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex):在响应已经被渲染后,执行该方法。

位于处理器链末端的是一个 Handler,DispatcherServlet 通过 HandlerAdapter 适配器对 Handler 进行封装,并按统一的适配器接口对 Handler 处理方法进行调用。

<mvc:interceptors>
    <mvc:interceptor>
        <mapping path="/secure/*">
        <bean class="com.smart.web.MyInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

可以在 smart-servlet.xml 中配置多个拦截器,每个拦截器都可以指定一个匹配的映射路径,以限制拦截器的作用范围。

猜你喜欢

转载自www.cnblogs.com/jwen1994/p/11210901.html