拦截器(Interceptor)

拦截器(Interceptor)

所谓拦截器,就是在一个请求到达前、到达时、到达后,都可以对该请求进行横向的修改。要实现一个拦截器,只需实现 HandlerInterceptor 接口即可,Spring MVC 底层会自动调用。

创建拦截器类

下面创建一个名为 MyHandlerInterceptor 的拦截器类:

package cn.bamn.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 void afterCompletion(HttpServletRequest arg0,
            HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("afterCompletion 执行");
    }

    @Override
    public void postHandle(HttpServletRequest arg0,
            HttpServletResponse arg1,
            Object arg2, ModelAndView arg3) throws Exception {
        System.out.println("postHandle 执行");
    }

    @Override
    public boolean preHandle(HttpServletRequest arg0,
            HttpServletResponse arg1,
            Object arg2) throws Exception {
        System.out.println("preHandle 执行");
        return true;
    }
}Code language: PHP (php)

注册拦截器

servlet.xml 中注册该拦截器:

<!-- interceptor setting -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/api/**"/>
        <bean class="cn.bamn.Interceptors.MyHandlerInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>Code language: HTML, XML (xml)

配置 <mvc:mapping path="/api/**"/>(注意是双星号)后,访问 /api 路径下的任何地址都会依次进入拦截器的三个方法执行。

执行效果

访问 http://localhost:8080/SpringMvc/api/user/1 时,控制台输出如下:

preHandle 执行
GET:1
postHandle 执行
afterCompletion 执行Code language: CSS (css)

执行顺序为:preHandle → 控制器方法 → postHandleafterCompletion。其中 preHandle 返回 true 时请求才会继续向下执行。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注