解決ExtJs中ajax重定向的問題

首先要明確的是,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;
    }
相關文章
相關標籤/搜索