在springmvc,为了更好控制处理器,spring提供了拦截器,用于介入控制器的执行。
只需要定义实现HandlerInterceptor接口,配置拦截地址即可。
1.实现HandlerInterceptor接口
package com.zw.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 MyInterceptor implements HandlerInterceptor {
/**
* 拦截器中第一个执行的方法 : 返回值为true时 放行 为 false 则拦截
* request : HTTP请求对象
* response : HTTP响应对象
* handler : 待执行的方法
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("handler:"+handler);
System.out.println("======preHandle=========");
return true;
}
/**
* postHandle 在具体的handler执行完成后执行
* 在具体的handle执行完成后 但是 视图解析完成前
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
modelAndView.addObject("key", "我是在拦截器中放入的参数");
System.out.println("============postHandle==========");
}
/**
* afterCompletion 在具体的handler执行完成后执行
* 视图解析后
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("===========afterCompletion============");
}
}
2.配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截地址 -->
<!-- 拦截所有的路径 -->
<mvc:mapping path="/**"/>
<!-- 排除地址 -->
<mvc:exclude-mapping path="/test2.do"/>
<mvc:exclude-mapping path="/test3.do"/>
<!-- 具体的拦截器 -->
<bean id="myInterceptor" class="com.zw.interceptor.MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
注意:
springmvc的拦截器,主要拦截Handler,由于拦截器是在DispatchServlet中执行,所以若你的url地址,根据不走DispatchServlet,那么拦截器将不会拦截。
在web项目中,一定存在filter但是未必存在HandlerInterceptor,而Filter的拦截是针对所有的请求,但是Interceptor针对的具体的Handler。