例如,我有一個登錄頁面A,一個主頁面B。我想讓用戶在A頁面登錄後,正常跳轉到B頁面。而不允許用戶直接用B頁面的url來訪問該頁面。整個開發的框架:html+js+php+apache+mysql


cookie里記錄一個sessionid,這個sessionid 由服務端來維護,我不知道你的這個case 是傳統的 Web Page 還是 Web App,如果是 Web Page 在後端 Template Router 上做一個auth校驗,如果訪問的URL沒有帶這個 sessionid,那麼不管訪問哪個頁面,都重定向到A頁面。如果是Web App,依然可以在Route 這個層面做一個 auth 的hook 來進入B頁面。


載入B時,先做個判斷,如果用戶沒有登錄信息,就重定向到A;如果用戶有登錄信息,那就正常載入B頁面


實現方式太多了,用前端的一些框架,做前後分離,前端的url跳轉都是js修改location,並不是真實訪問這個頁面,這也就意味著,這個頁面其實是不存在的。那麼用戶如果直接訪問這個頁面會404

第二種方案,檢查http頭的Referer。如果發現不是你想要的來源,那麼不返回數據


一般情況下如果是普通的html比較傳統的就是使用session來控制,用戶訪問後檢查用戶session中記錄的參數是否有登錄,如果登錄了就讓他正常訪問,如果未登錄也跳轉登錄。如果還涉及集群的話話可以把session使用redis存儲,不改變代碼邏輯,直接在伺服器中做修改。

前後端分離的話可以使用token,用戶無token或者token失效的話就認為用戶未登錄,系統判定則跳轉登錄頁面,如果有token的話也執行檢驗邏輯,檢驗真實性,有效性等等,檢驗完成則正常跳轉。這裡面有肯多的策略可以操作,比如設置token的有效時間(也就是默認在線時長)等等。token可以存儲在redis中,每次用戶訪問時都會先執行token校驗模塊,校驗成功則正常跳轉,檢驗失敗則跳轉登錄並且返回相應的返回消息到頁面。

我是一個java程序員,不過程序的理念應該都是想通的,在程序中設置一個通用訪問代碼塊(攔截器)用戶的每次請求默認執行該代碼塊,該代碼塊用來做校驗token


不知道PHP有沒有設置攔截器這一說法,按照普通套路是設置一個登錄攔截器來攔截所有要經過登錄的頁面URL地址


如果用戶直接訪問B頁面,那就再B頁面載入之前首先載入一個判斷本地是否有登錄狀態token的JS方法,如果沒有直接跳轉登錄頁A,如果有就可以成功訪問B頁面,那麼A頁面登錄之後就需要你把用戶的登錄狀態保存到本地localStorage里,退出登錄把localStorage的token給removeItem就可以了。

以上是最表面的,如果考慮很多種情況的話,那就還要判斷用戶是否再其他設備上登錄了,用戶登錄是否過期了,所以這裡就算在B頁面檢測到了本地有token,也要再把這個token傳給後台檢驗一下這個token是否過期,如果過期同理跳登錄頁。

以上。


推薦閱讀:
相关文章