preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现);
返回值:true表示继续流程(如调用下一个拦截器或处理器);
false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调(响应返回到视图后),如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。
正常流程:
中断流程:
在springMVC.xml配置:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.qdhtxx.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors> -->
其中loginInterceptor为具体实现类:
public class LoginInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String path = request.getServletPath();
System.out.println("path:" + path);
if (path.matches(Const.NO_INTERCEPTOR_PATH)) {
return true;
} else {
HttpSession session = request.getSession();
User user = (User) session
.getAttribute(Const.WBUSER_SESSION);
if (user != null) {
return true;
} else {
response.sendRedirect(request.getContextPath()
+ Const.WB_USER_LOGIN);
return false;
}
}
}
}
其中:
public class Const {
public static final String WBUSER_SESSION = "wbuser_session";
public static final String NO_INTERCEPTOR_PATH = "(/pages/system/login.jsp)||(/loginIn)||(/css/login.css)||(/js/jquery-1.7.2.min.js)||(/images/*.*)";
public static final String WB_USER_LOGIN = "/pages/system/login.jsp";
public static final String WB_USER_DEPT = "WB_USER_DEPT";
public static final String WB_USER_ROLES = "WB_USER_ROLES";
public static final String WB_USER_ROLE = "WB_USER_ROLE";
//=====================================
public static final String REDIRECT_HOME = "/";
public static final String SESSION_USER = "USER"; //保存用户
public static final String LAST_PAGE = "LAST_PAGE"; //
// 保存cookie的cookieName
public static final String COOKIEDOMAINNAME = "2015_V_5_SSM"; //自己随便定义
// 加密cookie时的网站自定码
public static final String WEBKEY = "2015_V_5_SSM"; //自己随便定义
}
里面的NO_INTERCEPTOR_PATH是不会被拦截的请求路径,如果是其他路径,当发现session里面没有用户登录时会返回到登录页,即:WB_USER_LOGIN。
还有另外一种方式可以区分出不被拦截的路径,在配置文件中加:
<mvc:exclude-mapping path="/manage/user/login.do"/>
来排除某个路径。例如:
<mvc:interceptors>
<!-- 定义在这里的,所有的都会拦截-->
<mvc:interceptor>
<!--manage/a.do /manage/*-->
<!--manage/b.do /manage/*-->
<!--manage/product/save.do /manage/**-->
<!--manage/order/detail.do /manage/**-->
<mvc:mapping path="/manage/**"/>
<!--排除某个路径-->
<!--<mvc:exclude-mapping path="/manage/user/login.do"/>-->
<bean class="com.mmall.controller.common.interceptor.AuthorityInterceptor" />
</mvc:interceptor>
<!--<!–第二个拦截器–>-->
<!--<mvc:interceptor>-->
<!---->
<!--</mvc:interceptor>-->
</mvc:interceptors>
过滤器也可以实现类似的功能,他们二者之间的区别,可见:
对于Java Web中的Filter和Interceptor的理解