1. SpringMVC中的拦截器(Interceptor)
1.1. 基本概念
在SpringMVC中的拦截器可以是运行在控制器(Controller)之前的组件,可以设置拦截器应用于哪些请求路径,当发生这些请求时,拦截器会自动执行,在执行过程中,可以对请求相关数据进行判断,选择阻止继续向后执行,或选择放行。
注意:拦截器是一个若干种请求都会经历的执行过程,但是,并不一定需要阻止继续运行,只要是若干种请求都需要做相同的事情,也许每种请求的处理过程都是选择放行,也可以使用拦截器。
1.2. 开发拦截器
首先,所有的拦截器类都必须实现HandlerInterceptor
接口,可以自定义LoginInterceptor
:
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("LoginInterceptor.preHandle()");
return false;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("LoginInterceptor.postHandle()");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("LoginInterceptor.afterCompletion()");
}
}
在拦截器的3个方法中,只有preHandle()
方法是运行在控制器(Controller)之前的,另2个方法是运行在控制器之后的,所以,只有preHandle()
具有真正意义的“拦截”功能,该方法的返回值是boolean
类型的,当返回true
时表示放行,返回false
时将阻止继续向后执行,即控制器并不会被执行:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("LoginInterceptor.preHandle()");
// 获取Session
HttpSession session = request.getSession();
// 检查Sessi