拦截器拦截的是controller,如果先跳转页面,页面调用controller,无法完成拦截跳转
拦截器类
package com.cyboil.utils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class LoginInterceptor extends HandlerInterceptorAdapter{
private final Logger log = Logger.getLogger(LoginInterceptor.class);
/*
* 利用正则映射到需要拦截的路径
private String mappingURL;
public void setMappingURL(String mappingURL) {
this.mappingURL = mappingURL;
}
*/
/**
* 在业务处理器处理请求之前被调用
* 如果返回false
* 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
* 如果返回true
* 执行下一个拦截器,直到所有的拦截器都执行完毕
* 再执行被拦截的Controller
* 然后进入拦截器链,
* 从最后一个拦截器往回执行所有的postHandle()
* 接着再从最后一个拦截器往回执行所有的afterCompletion()
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器启动!!");
//获取请求的URL
String url = request.getRequestURI();
System.out.println(url);
//URL:login.jsp是公开的;这个demo是除了login.jsp是可以公开访问的,其它的URL都进行拦截控制
if(url.indexOf("AnalogLogin")>=0){
return true;
}
//获取Session
HttpSession session = request.getSession();
String username = (String)session.getAttribute("userName");
if(username != null){
return true;
}
//不符合条件的,跳转到登录界面
request.getRequestDispatcher("/").forward(request, response);
return false;
}
/**
* 在业务处理器处理请求执行完成后,生成视图之前执行的动作
* 可在modelAndView中加入数据,比如当前时间
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
log.info(ConfigConstants.ExecutionOrderTwo);
//System.out.println(TestInterface.findPrison().toString());
if(modelAndView != null){ //加入当前时间
modelAndView.addObject("var", ConfigConstants.TestPostHandle);
}
}
/**
* 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
*
* 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
log.info(ConfigConstants.ExecutionOrderThree);
}
}
springmvc配置
<mvc:interceptors>
<mvc:interceptor>
匹配的是url路径, 如果不配置或/**,将拦截所有的Controller
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/login.jsp"/>
<mvc:exclude-mapping path="/index.jsp"/>
<bean class="com.cyboil.utils.LoginInterceptor"></bean>
</mvc:interceptor>
当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法
</mvc:interceptors>