对所有请求拦截,未登录的做跳转到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' });