前面说过,当前台是ajax传过来的请求的时候拦截器并不能跳转,原因可想而知了,因为ajax是局部的,不管是成功还是失败都会由ajax的的成功或者失败函数的进行处理。
没看过的可查看另一篇文章http://blog.csdn.net/make__it/article/details/78840576
那我们就需要区分传过来的请求是否是ajax请求,然后将Url的转发交给前台来做
原理:ajax请求会先发送一个请求头,判断正确后才发送真正的请求
代码如下
1.后台代码
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
// TODO Auto-generated method stub
if (req.getHeader("x-requested-with") != null && req.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ //如果是ajax请求响应头会有x-requested-with
PrintWriter out = resp.getWriter();
out.print("loseSession");//session失效
out.flush();
return false;
}
//当请求去的是登陆页面就直接放行
if(arg0.getRequestURI().contains("login")){
return true;
}
HttpSession session= arg0.getSession();
String username=(String) session.getAttribute("username");
if(username!=null){
return true;
}
//跳转到登陆界面进行登陆
arg0.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(arg0, arg1);
return false;
}
2.前台代码
$("test").click(function(){
data = ...;
$.ajax({
type: "POST",
url: "../query.do",
data:data,
dataType: "json",
success:function(data){
//成功的处理
}
error:function(data){
if(data.responseText=='loseSession'){
//在这个地方进行跳转
}
}
});