拦截器的使用
在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...