在学习Servlet的时候,其中有一部分内容,应用也很广泛,那就是过滤器。过滤器经常用在对请求的处理操作,比如常用的字符编码处理,登录验证,权限操作等等。在Spring MVC中要处理这些问题,也同样可以使用过滤器,不过Spring MVC提供了自己的一套处理机制,就是拦截器。
Spring MVC的拦截器又被称为处理器拦截器,用于对处理器进行预处理和后处理。主要应用在日志记录、目标检查、权限控制等等操作,功能和过滤器差不多。
实现Spring MVC的拦截器非常简单,只需要创建一个类实现HandlerInterceptor接口,然后在Spring MVC配置文件中添加配置即可。接下来我们通过一个简单的例子,讲述Spring MVC拦截器的基本操作。首先创建一个类HelloInterceptor让其实现HandlerInterceptor接口,代码如下。
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 {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
return false;
}
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
HandlerInterceptor接口中包含三个方法,分别是:preHandle、postHandle和afterCompletion。
preHandle方法是boolean返回类型,默认是返回false,preHandle方法类似过滤器中的doFilter方法。实际开发中要把返回值设置为true,让程序继续执行,类似于过滤器中的chain.doFilter(request, response)操作。preHandle方法和过滤器中的doFilter方法一样,都是在目标方法执行之前调用,因此,可以在preHandle方法中做相应的操作,比如权限控制,日志操作,事务处理等操作。
postHandle方法是在调用目标方法之后,渲染页面之前调用。postHandle方法中包含HttpServletRequest参数和ModelAndView参数,因此可以在postHandle方法中做请求域或者视图里的数据做修改。
afterCompletion方法是在整个请求处理完毕后的回调方法,即在视图渲染完毕后调用afterCompletion方法,如性能监控中我们可以在此记录结束时间并输出消耗时间。afterCompletion方法还可以进行一些资源清理,类似于try-catch-finally中的finally。
修改HelloInterceptor中的代码,进行测试,代码如下。
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 {
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion");
}
}
创建完成拦截器类之后,并不能马上起作用,和过滤以一样需要配置之后才可以。接下来在Spring MVC配置文件中添加配置,代码如下。
<mvc:interceptors>
<bean class="com.tuwei.interceptor.HelloInterceptor"/>
</mvc:interceptors>
此时拦截器就可以正常使用了。
拦截器可以配置多个,只需要继续在<mvc:interceptors>中继续添加配置即可。有的时候需要专门制定要拦截的资源,可以通过以下配置完成,代码如下。
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/employee"/>
<bean class="com.tuwei.interceptor.HelloInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
添加完配置以后,该拦截器只会作用于employee资源,其他的内容不会得到拦截。