web系統中常常使用攔截器或過濾器實現權限攔截,判斷用戶是否登陸,若未登陸,跳轉到登陸頁,但當瀏覽器發的是ajax請求時,瀏覽器不會正常跳轉,而是返回登陸頁的HTML源碼給ajax回調函數(當跳轉的登陸頁跨域時,會出現302錯誤),解決方案如下:
前端:
//如果session超時或未登陸,則跳轉到登陸頁
$(document).ajaxComplete(function(event,request, settings){ var data=request.responseJSON; if(data.ret!=null&&data.ret==302)//根據服務器端返回的數據判斷 { window.location=data.redirectUrl; } });
服務器:
@RequestMapping(value = "/nologin") public void login(HttpServletRequest request,HttpServletResponse response, Model model) throws Exception { if(request.getHeader("X-Requested-With")!=null&&request.getHeader("X-Requested-With").equals("XMLHttpRequest")) { response.getWriter().write({"ret":302,"msg": " ","redirectUrl":“”}"); }else { response.sendRedirect(applicationProps.getProperty("oauth.ucenter.url")); } }
服務端根據請求頭X-Requested-With是否有值且是否是XMLHttpRequest(表示ajax請求)來判斷是否是ajax請求,如果是則返回json數據,若不是則正常跳轉;
前端為ajax請求添加的全局的Complete方法,ajax請求完成時觸發(不管請求是否成功),其中 var data=request.responseJSON;是獲取服務器返回的Jason數據,根據json數據完成跳轉。