webix+springmvc session超時跳轉登錄頁面

来源:http://www.cnblogs.com/lijinxin/archive/2016/10/30/6012966.html
-Advertisement-
Play Games

2016-10-30 13:11:56 引言 最近做項目,發現ajax請求不能在伺服器中直接重定向到登錄頁面。查了些資料發現jquery的ajax請求有人給出了方法。但是webix的ajax請求和jquery的有些區別。這裡模仿jquery的處理方式實現webix的ajax請求session超時跳轉 ...


2016-10-30 13:11:56

引言

最近做項目,發現ajax請求不能在伺服器中直接重定向到登錄頁面。查了些資料發現jquery的ajax請求有人給出了方法。但是webix的ajax請求和jquery的有些區別。這裡模仿jquery的處理方式實現webix的ajax請求session超時跳轉。

 

具體的做法:

1、查看webix.js源碼發現webix.ajax只有請求前的監聽函數 "onBeforeAjax", 要做到獲取返回狀態跳轉登錄頁面必須要有個返回的監聽函數,但是源碼沒有。所以我修改了下源碼,加了個返回的監聽函數"onAfterAjax"。

紅色標記部分是我加的代碼,當檢測到ajax完成時,自動執行"onAfterAjax"。(代碼的位置可以搜索webix.js ,條件"onBeforeAjax",然後在對應的位置加入紅色代碼就行

  if (webix.callEvent("onBeforeAjax", [s, t, e, a, o, null, r])) {
            var h = !1;
            if ("GET" !== s) {
                var l = !1;
                for (var c in o)"content-type" == c.toString().toLowerCase() && (l = !0, "application/json" == o[c] && (h = !0));
                l || (o["Content-Type"] = "application/x-www-form-urlencoded")
            }
            if ("object" == typeof e)if (h)e = this.stringify(e); else {
                var u = [];
                for (var d in e) {
                    var f = e[d];
                    (null === f || f === webix.undefined) && (f = ""), "object" == typeof f && (f = this.stringify(f)), u.push(d + "=" + encodeURIComponent(f))
                }
                e = u.join("&")
            }
            e && "GET" === s && (t = t + (-1 != t.indexOf("?") ? "&" : "?") + e,
                e = null), a.open(s, t, !this.H);
            var b = this.Tw;
            b && (a.responseType = b);
            for (var c in o)a.setRequestHeader(c, o[c]);
            var x = this;
            return this.master = this.master || n, a.onreadystatechange = function () {
                if (!a.readyState || 4 == a.readyState) {
                    if (webix.callEvent("onAfterAjax", [a]) === !1) {
                        return false;
                    };
                    if (webix.ajax.count++, i && x && !a.aborted) {
                        if (-1 != webix.ly.find(a))return webix.ly.remove(a);
                        var t, e, s = x.master || x, r = a.status >= 400 || 0 === a.status;
                        "blob" == a.responseType || "arraybuffer" == a.responseType ? (t = "", e = a.response) : (t = a.responseText || "", e = x.J(a)), webix.ajax.$callback(s, i, t, e, a, r)
                    }
                    x && (x.master = null), i = x = n = null
                }
            }, this.qh && (a.timeout = this.qh), this.H ? a.send(e || null) : setTimeout(function () {
                a.aborted || (-1 != webix.ly.find(a) ? webix.ly.remove(a) : a.send(e || null));
            }, 1), this.master && this.master.Ve && this.master.Ve.push(a), this.H ? a : r
        }

 

2、webix.ajx請求沒有明顯的標誌,jquery.ajax的標識是x-requested-with ,所以我模擬給了個標識requestFlag="webix"(可以自己設置個喜歡的),用"onBeforeAjax"設置

webix.attachEvent("onBeforeAjax",function(s, t, e, a, o){o["requestFlag"]="webix"})

 

 3、監聽返回狀態

webix.attachEvent("onAfterAjax",function(xhr){if(xhr.getResponseHeader("sessionstatus")=='timeout'){window.location.href='/webix/login.html'}});

 

 4、後臺代碼

4.1  攔截器代碼

package com.ljx.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class UserInterceptor implements HandlerInterceptor {

    @Override
    public void afterCompletion(HttpServletRequest arg0,
            HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
    }

    @Override
    public void postHandle(HttpServletRequest arg0,
            HttpServletResponse response, Object arg2, ModelAndView arg3)
            throws Exception {
        response.sendRedirect("/webix/login.html");
    }

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        Object obj = request.getSession().getAttribute("LOGIN");
        if (null == obj) { // 未登錄
            if (request.getHeader("requestFlag") != null
                    && request.getHeader("requestFlag").equalsIgnoreCase(
                            "webix")) { // 如果是ajax請求響應頭會有,requestFlag
                response.setHeader("sessionstatus", "timeout");// 在響應頭設置session狀態
            } else {
                response.sendRedirect(request.getContextPath() + "/login");
            }
            return false;
        }
        return true;
    }

}

 

 4.2 spring配置文件加入攔截器配置

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/mvc/*" />
            <bean class="com.ljx.filter.UserInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

 

 4.3 在F12控制台執行下webix.ajax查看效果

webix.ajax().get("/webix/mvc/login.action")

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡單的實現了 灰度,黑白,底片,模糊,馬賽克(代碼比較簡單,通過canvas實現的) 感覺挺有意思的,上面解釋很詳細,直接看代碼 ...
  • 第7章 jQuery插件的使用和寫法 插件又稱擴展,是一種遵循一定規範的應用程式介面寫出來的程式。 插件的編寫思想基於面向對象。 獲取最新的插件可以查看jquery官網: 本章將從幾個基本的例子來介紹jquery插件的使用。 一\. 表單驗證插件Validation jquery最常用的場合就是表單 ...
  • 一.綁定Class屬性。 綁定數據用v-bind:命令,簡寫成: 語法:<div v-bind:class="{ active: isActive }"></div>。class後面的雙引號里接受一個對象字面量/對象引用/數組作為參數, 這裡,{active: isActive}是對象參數,acti ...
  • 偽元素是一個好東西,但是很多人都沒怎麼用,因為他們覺得偽元素太詭異了。其實使用偽元素有很多好處,最大的好處是它可以簡化頁面的html標簽,同時用起來也很方便,善於使用偽元素可以讓你的頁面更加地簡潔優雅。 更好的閱讀體驗移步:http://yincheng.site/using-before-afte ...
  • 項目 (移動的廣告牌) 要求: 1,實現圖片一次以移動的方式出現,到最後一張完全出現時,回彈到第一張 2,滑鼠放在圖片上面圖片移動,滑鼠離開,圖片停止移動 *{ padding: 0; margin: 0;}/*添加背景圖片,個人愛好*/body{ background: url(../img/qu ...
  • 引言 webix.js被壓縮後很多字母不清楚是什麼用處,看源碼整理了部分出來,以button為例 1、button代碼 效果 2、以下代碼在F12的console中測試 define:方法(可以定義對象屬性的值) refresh:方法(刷新控制項) 效果 D 和 C:兩個都是定義屬性值的,define ...
  • 看到一些曾經只會灌水的網友,在學習了前端之後,已經能寫出下載量幾千幾萬的腳本、樣式,幫助大眾,成為受歡迎的人,感覺滿羡慕的。我也想學會前端技術,變得受歡迎呀。於是心血來潮,開始學習前端知識,並寫下了這個小練習。 基本思路是這樣的: 效果圖: 代碼如下: 點我進入線上版 這算是自己學習Javascri ...
  • 一:時間轉時間戳:javascript獲得時間戳的方法有四種,都是通過實例化時間對象 new Date() 來進一步獲取當前的時間戳 1.var timestamp1 = Date.parse(new Date()); // 結果:1477808630000 不推薦這種辦法,毫秒級別的數值被轉化為0 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...