Spring MVC拦截器初步使用及拦截器方法的调用顺序

拦截器的使用

在WEB项目中,要使用Spring MVC 拦截器的步骤如下:
1. 写一个类实现org.springframework.web.servlet.HandlerInterceptor接口,实际应用中,一般继承自org.springframework.web.servlet.handler.HandlerInterceptorAdapter抽象类(其本质上也是实现了org.springframework.web.servlet.HandlerInterceptor接口)。
2. 在Spring配置文件中配置步骤1中编写的拦截器

拦截器示例1:实现HandlerInterceptor接口

package com.mercy.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class HelloInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub

    }

}

拦截器示例2:继承HandlerInterceptorAdapter抽象类

package com.mercy.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class HelloInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // TODO Auto-generated method stub
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
        super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
        super.afterCompletion(request, response, handler, ex);
    }

}

在Spring配置文件中配置拦截器

<mvc:interceptors>
   <mvc:interceptor>
       <!-- 拦截所有请求 -->
       <mvc:mapping path="/**"/>
       <!-- 过滤/xxx开头的所有请求 -->
       <mvc:exclude-mapping path="/xxx/**"/>
       <bean class="com.mercy.interceptor.HelloInterceptor"></bean>
   </mvc:interceptor>
</mvc:interceptors>

拦截器执行顺序

若配置了多个拦截器,配置如下:

<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.mercy.interceptor.CleanInterceptor"></bean>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/index.jsp"/>
        <mvc:exclude-mapping path="/UserOperate/UserLogoutDb"/>
        <mvc:exclude-mapping path="/UserOperate/UserLogoutInstance"/>
        <bean class="com.mercy.interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/index.jsp"/>
        <bean class="com.mercy.dynamic.data.source.DynamicDataSourceInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

各个拦截器方法之间的执行顺序如下:

CleanInterceptor.preHandle...  
LoginInterceptor.preHandle...   
DynamicDataSourceInterceptor.preHandle...  

invoke handler...

DynamicDataSourceInterceptor.postHandle...  
LoginInterceptor.postHandle...  
CleanInterceptor.postHandle...  
DynamicDataSourceInterceptor.afterCompletion...  
LoginInterceptor.afterCompletion...   
CleanInterceptor.afterCompletion...  

猜你喜欢

转载自blog.csdn.net/cccmercy/article/details/80935670