拦截器原理
对于 Spring MVC 来说,拦截器的主要作用是拦截用户的请求并进行相应的处理,如权限验证等。
Interceptor 拦截器拦截请求通过实现 HandlerInterceptor 接口来完成。HandlerInterceptor 接口中有三个方法:
preHandle():该方法在请求处理之前被调用。它的返回值是一个 boolean 类型,若为 true,则继续调用后面的拦截器和目标方法,若为 false,则不会调用后面的拦截器和目标方法,表示请求结束。
postHandle():该方法只能在当前所属的 Interceptor 的 preHandle 方法返回值为 true 时才能调用,它在当前请求进行处理之后,即 Controller 方法被调用之后,视图被渲染之前执行。
afterCompletion():该方法只能在当前所属的 Interceptor 的 preHandle 方法返回值为 true 时才能调用,它在整个请求结束之后,即视图被渲染之后执行,其主要作用是进行资源清理。
注:在 Spring MVC 中,一个请求可以添加多个拦截器 Interceptor,每个 Interceptor 的调用会根据声明顺序依次执行。最先执行的是 preHandle 方法, postHandle 方法的被调用的方向和 preHandle 相反。
web.xml
配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*"/>
自定义拦截器类
<bean class="com.Interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
自定义拦截类
package com.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 LoginInterceptor implements HandlerInterceptor {
private static final String[] IGNORE_URI = { "/login" };
//该方法在controller处理前调用
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
System.out.println("This is preHandle!");
// flag 表示是否登录
boolean flag = false;
// 获取请求的 URL
String url = request.getServletPath();
for (String s : IGNORE_URI) {
if (url.contains(s)) {
flag = true;
break;
}
}
if (!flag) {
// 获取 Session 并判断是否登录
String username = (String) request.getSession().getAttribute(
"username");
if (username == null) {
request.setAttribute("message", "Please log in first!");
System.out.println("------");
// 如果未登录,进行拦截,跳转到登录界面
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp")
.forward(request, response);
} else {
flag = true;
}
}
return flag;
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
}