对所有请求拦截,未登录的做跳转到login.html页,使用redirect,但是返回了login.html,但是没有跳转。谷歌浏览器
@Override
public void intercept(Invocation inv) {
//排除拦截,避免死循环
boolean flag = true;
for(int i = 0 ; i < interceptList.length ; i++){
if(inv.getActionKey().equals(interceptList[i])) flag = false;
}
if(flag){
Controller controller = inv.getController();
String u_token= controller.getCookie("token");
System.out.println(u_token);
if(u_token==null||"".equals(u_token)){
controller.redirect("../login.html");
return;
}else{
Map<String, Object> token = TokenUtil.parserJavaWebToken(u_token);
System.out.println(token);
System.out.println("Before invoking " + inv.getActionKey());
inv.invoke();
System.out.println("After invoking " + inv.getActionKey());
}
}else{
inv.invoke();
}
}解决方案:
在服务端添加请求头信息,包含是否重定向,重定向路径等
在前端全局js中使用ajax的complete函数(在ajax请求完成后调用)做处理,重定向
if(u_token==null||"".equals(u_token)){
controller.getResponse().setHeader("redirect", "true");
controller.getResponse().setHeader("loginPath", "/login.html");
controller.renderNull();
return;
}/**
* ajax默认设置
* 包括默认提交方式为POST,
* 判断后台是否是重定向
*/
$.ajaxSetup( {
//设置ajax请求结束后的执行动作
complete : function(XMLHttpRequest, textStatus) {
// 通过XMLHttpRequest取得响应头,redirect
var redirect = XMLHttpRequest.getResponseHeader("redirect");//若HEADER中含有redirect说明后端想重定向
if (redirect == "true") {
var win = window;
while (win != win.top){
win = win.top;
}
//将后端重定向的地址取出来,使用win.location.href去实现重定向的要求
myAlert("身份失效,请重新登录",6);
win.location.href= XMLHttpRequest.getResponseHeader("loginPath");
}
},
type:'POST'
});