SpringMVC学习5 - 拦截器

HandlerExecutionChain是一个执行链,从HandlerMapping(处理器映射器)返回给DispatcherServlet(前端控制器),其中包含了Handler对象和拦截器Interceptor对象(数组),SpringMVC的拦截器接口定义了3个方法:
1、preHandler:调用Handler之前执行
2、postHandler:调用Handler之后执行
3、afterCompletion:视图渲染完成之后执行




拦截器的执行过程:



  拦截器是顺序执行,按图从左到右,先执行拦截器中的preHandler方法,一直执行到Handler处理业务逻辑,处理完Handler之后,按上图再倒叙的执行拦截器postHandler方法。



自定义拦截器的实现:

自定义拦截器:

package com.its.springmvc.interceptors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 自定义拦截器
 */
public class MyHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("--------MyHandlerInterceptor的前置方法执行了----------");
        /**
         * true:放行通过 
         * false:拦截不通过
         */
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("--------MyHandlerInterceptor的后置方法执行了----------");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("--------MyHandlerInterceptor的视图渲染完成方法执行了----------");
    }
}


在springmvc配置文件中配置拦截器:



配置多个自定义拦截器:




拦截器总结:
1、拦截器的执行过程和Struts2的拦截器执行过程类似。
2、拦截器的前置方法是顺序执行,如果其中一个返回false则请求被拦截(不通过)。
3、拦截器的后置方法是倒序执行,后置方法只有在前置方法全部执行后才能被执行。
4、拦截器的完成方法是倒序执行,完成方法不仅是在最后执行,而且如果前置方法返回false,也会被执行(已经通过执行的拦截器的完成方法)。


SpringMVC拦截器执行顺序源码分析:
1、拦截器的前置方法是正序执行


2、拦截器的后置方法是倒序执行



3、拦截器的完成方法是倒序执行





猜你喜欢

转载自blog.csdn.net/mayor125/article/details/52440963