首先要明確的是,ajax是局部刷新,是不支持重定向的,只能經過
window.location.href='http://xxx/error.html'
的方式實現,在後臺重定向只會把html返回給前臺,頁面並不會跳轉。javascript
需求
首先咱們項目採用的是extJs作UI框架,後臺是SSM。如今項目要加入簡單數據權限過濾的功能,因而我使用過濾器,獲取用戶訪問的接口地址,判斷只要與session中的能夠訪問的數據接口權限不匹配,那麼就跳轉到無權限的錯誤頁面。html
問題
問題來了,ExtJs都是採用ajax向後臺發送請求,這時候若是重定向到無權限的錯誤頁面就會產生問題。最直接的解決方案就是,每個向後臺發送的ajax請求,後臺都會返回message
,而後判斷messsage
,不符合條件就window.location.href='http://xxx/error.html'
。可是,若是初期有這樣的設計就行了,但我這個項目是後期才加權限的功能,若是一個個改起來,確定是不可能的。java
解決方法
解決方法1
新建一個js文件,添加以下代碼:ajax
//爲Ext的ajax添加監聽 //requestcomplete:請求完成 Ext.Ajax.addListener("requestcomplete",function(conn, response, options, eOpts){ //後臺也能夠放入請求頭還獲取錯誤信息,前臺經過`response.getAllResponseHeaders()`來獲取 //var msg = response.getAllResponseHeaders(); if(response.responseText.indexOf('error') != -1){ window.location.href='http://xxx/error.html'; } },this);
通常咱們的項目都是一個主的main.jsp
,而後裏面一個個ExtJs的iframe,因此在main.jsp
中直接引入剛纔新建的js,當ajax請求完成後,接收到後臺返回的message
,不符合條件,跳轉到錯誤頁面。session
解決方法2
方法2比較通用也比較簡單,直接在filter中使用out.print輸出一段js進行跳轉。框架
UserVo u = (UserVo) session.getAttribute("user"); if (u == null) { PrintWriter out = res.getWriter(); if (req.getHeader("x-requested-with") != null && req.getHeader("x-requested-with").equals("XMLHttpRequest")) { String message = path + "/user/loginHome"; out.print(message); return; }else { out.println("<html>"); out.println("<script>"); out.println("alert('登陸超時!請從新登陸')"); out.println("window.open ('" + path + "/user/loginHome','_top')"); out.println("</script>"); out.println("</html>"); return; }