各类拦截器的传统写法案例:
1 在spring-mvc.xml 文件中添加 拦截器 如下:
<!-- 通用拦截器配置 -->
<mvc:interceptors>
...
...
<mvc:interceptor>
<mvc:mapping path="/data/**"/>
<bean class="com.icinfo.system.interceptor.NotLoggedInToIntercept"/>
</mvc:interceptor>
</mvc:interceptors>
2 拦截器类编写如下:
package com.icinfo.system.interceptor;
import com.icinfo.support.constants.Constants;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 描述 未登录认证访问拦截
*
* @author
* @date 2018/11/8
*/
public class NotLoggedInToIntercept implements HandlerInterceptor {
//登录页地址
private static final String loginUrl = "/";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
HttpSession session = request.getSession(false);
if (session == null || !request.isRequestedSessionIdValid()) {
response.sendRedirect(request.getContextPath() + loginUrl);
return false;
}
//获取登录用户信息
Object object = session.getAttribute(Constants.SESSION_LOG_KEY);
if (object == null) {
response.sendRedirect(request.getContextPath() + loginUrl);
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception {
}
}
拦截器: 就是对请求进行拦截,做一些预处理、后处理或返回处理的操作 。
Spring MVC中使用拦截器的方法,也可继承HandlerInterceptorAdapter类,并根据需求实现其中的preHandle方法(预处理)、postHandle方法(返回处理),afterCompletion方法(后处理)。
下面重点说下preHandler方法:
当请求来的时候,先经过applyPreHandle,内部会按顺序获取所有的拦截器,并依次拦截
当进入拦截器链中的某个拦截器,并执行preHandle方法后
1.当preHandle方法返回false时,从当前拦截器往回执行所有拦截器的afterCompletion方法,再退出拦截器链。也就是说,请求不继续往下传了,直接沿着来的链往回跑。
2.当preHandle方法全为true时,执行下一个拦截器,直到所有拦截器执行完。再运行被拦截的Controller。然后进入拦截器链,运行所有拦截器的postHandle方法,完后从最后一个拦截器往回执行所有拦截器的afterCompletion方法.