用戶進入頁面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方法和參數。