springMVC拦截器在对一些请求有特定功能的需求的时候很有用,比如在请求时对用户检查身份等。
SpringMVC拦截器原理
SpringMVC拦截器实现了org.springframework.web.servlet包下的HandlerInterceptor接口,这个接口定义了三个回调方法:
- preHandle()
- postHandle()
- afterCompletion()
preHandle()方法在处理器实际执行之前会被执行,postHandle()方法在处理器执行之后执行,afterCompletion()在整个请求处理完成之后被执行。这三个方法为各种类型的前处理和后处理需求提供了足够的灵活性。
preHandle(..)方法返回一个boolean值。你可以通过这个方法来决定是否继续执行处理链中的部件。当方法返回 true时,处理器链会继续执行;若方法返回 false, SpringMVC的核心“DispatcherServlet”即认为拦截器自身已经完成了对请求的处理(可以认为成功拦截),那么其余的拦截器以及执行链中的其他处理器就不会再被执行了。
xml配置
springMVC的拦截器用 interceptors配置:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/bc/**"/>
<mvc:exclude-mapping path="/news/**"/>
<bean class="com.evcipa.comutil.Interceptor" /> //具体的拦截类
</mvc:interceptor>
</mvc:interceptors>
mapping path是需要拦截的匹配路径,而exclude-mapping path是不需要拦截的路径,如果在整个通配符匹配的拦截路径中有因业务需要而不要求拦截的路径,可用exclude-mapping path剔除。
package com.evcipa.comutil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class Interceptor implements HandlerInterceptor {
private final Logger logger = Logger.getLogger(Interceptor.class);
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
Object obj = request.getSession().getAttribute("userType");
if (obj == null) {
response.sendRedirect(request.getContextPath()+"/views/502.jsp");
logger.info("session失效!");
return false;
}else{
return true;
}
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
在接收到请求并拦截成功后,页面会被重定向到拧另一个页面。注意:在拦截成功后一定要返回false。这样处理器才会做后续的处理,正确的渲染视图。