JS+PHP實現登陸後自動執行以前的操做

問題

用戶進入頁面A,在頁面A上要執行一個操做X。操做X須要用戶登陸後才能訪問,所以系統引導用戶到登陸頁,用戶登陸後在讓用戶繼續執行操做X。javascript

分析

操做X存在兩種狀況,1:跳轉到一個頁面B;2:執行一個操做。php

進入頁面B的狀況,要在頁面B的入口位置判斷是否用戶是否爲登陸狀態,是則進入,不然進入登陸頁面,登陸成功後再進入頁面B。假設頁面A的URL是是url-a,頁面B的url是url-b,登陸頁面的url是url-l,那麼瀏覽器的地址依次是url-a,url-b,url-l,url-b。所以,系統就是要解決登陸模版如何記錄url-b,並在成功後進入url-b。前端

執行一個操做的狀況。執行操做前判斷用戶的登陸狀態,是則執行操做,不然先跳轉到登陸頁面,登陸成功後返回頁面A,頁面A繼續執行以前的操做。這時,登陸頁要記錄頁面A,登陸成功後返回A,頁面A要記錄用戶的操做和參數,從登陸頁返回後繼續執行。java

實現

頁面跳轉

頁面跳轉的狀況,由頁面B負責判斷是否要跳轉到登陸頁,若是須要用redirect的方式完成。ajax

header("Location: $loginURL");
exit;

在login頁面須要知道是從哪一個頁面跳轉來,並保存,這樣登陸成功後再跳轉回原來的頁面。PHP中能夠經過$_SERVER['HTTP_REFERER']得到是從哪一個頁面進入的的登陸頁。後端

$referer = $_SERVER['HTTP_REFERER'];

進入登陸頁時得到的$referer必需要記錄下來,才能在登陸成功後跳轉回以前的頁面。跨調用保存信息有4種方式:一、保存在session中;二、保存在cookie中;三、做爲參數放在url中;四、生成頁面時,做爲頁面的隱藏信息。瀏覽器

放在session中,只能經過php獲取,所以,登陸成功後跳轉回原頁面的操做只能在php中進行,這樣就不能實現經過一個ajax調用驗證用戶登陸信息後,在前端頁面直接跳轉指定頁面。服務器

採用cookie的方式須要先後端共同肯定一個約定,用什麼表明頁面的跳轉信息,另外前端須要增長cookie的處理邏輯。這種方式能夠同時支持前端或後端進行跳轉。cookie

做爲參數放在url中能夠實如今前端進行跳轉,可是會致使url看起來有些怪異,同時還須要考慮url編碼的問題。session

直接生成在登陸頁面中(利用頁面模版)做爲前端參數,這種方式支持在前端進行跳轉,須要先後端約定參數的定義。

執行操做

執行操做的狀況應該是頁面A判斷用戶是否已經登陸,或者根據執行操做X的返回結果,由頁面A直接跳轉到登陸頁面,登陸界面記錄是從哪一個頁面跳轉來的。

header("Location: $loginURL");
exit;

頁面A執行跳轉到登陸頁面前,首先記錄要執行的操做,例如:操做的名稱,這個信息必須能夠跨請求訪問。操做的相關信息能夠經過url、session、cookie傳遞,或者經過localStorage、sessionStorage保留在客戶端。

若是用url指定要執行的操做(用history.pushState替換url),只能攜帶簡單的參數(放在history中是個好方法?沒想明白),通用性很差。session和cookie須要向服務器端傳數據,並且獲取保留的參數並不方便。最後決定選擇sessionStorage保存要執行的方法。

跳轉到登陸界面前保存要執行的操做:

if (window.sessionStorage) {
    var method = JSON.stringify({
        name: '要執行的方法的名稱',
        args: [參數1,參數2]
    });
    window.sessionStorage.setItem('pending.method', method);
}

從登陸界面跳轉回頁面,取出要執行的操做並執行:

if (window.sessionStorage) {
    var pendingMethod;
    if (pendingMethod = window.sessionStorage.getItem('pending.method')) {
        window.sessionStorage.removeItem('pending.method');
        pendingMethod = JSON.parse(pendingMethod);
        window[pendingMethod.name].apply($scope, pendingMethod.args || []);
    }
}

總結,採用的方式是經過HTTP_REFERER和cookie記錄登陸後要跳轉的頁面,經過sessionStorage記錄返回頁面後要執行的javascript方法和參數。

相關文章
相關標籤/搜索