PSO 與 Session

你們都知道,PSO是不支持session的,換句話說,登陸有效期是永久的。通常網站,若是你不操做一段時間之後,必須從新登陸。PSO不是這樣的,你一旦登陸後,即使服務器重啓了,你依然能訪問服務器並不須要從新登陸,服務器依然知道訪問的是用戶是誰;你打開瀏覽器登陸了PSO,而後再打開一個新頁面,它還讓你從新登陸。咱們分別分析下通常網站的和PSO的區別。web

一、通常網站爲什麼超時後必須從新登陸
爲什麼要求超時,這純粹是處於安全考慮。它是怎麼作到的呢。session!session翻譯成會話,表明你從登錄到退出這段時間。技術上,session保存在服務端,一個登錄對應一個。若是有你的session,表示你的登陸時有效的,不然你就不能訪問系統。你們都知道http協議是無狀態的,第一次訪問和第二次訪問本質上是無關的。那麼服務器怎麼知道來自客戶端的一次訪問對應服務器內的哪一個session呢?
cookie你們都知道吧,是網站存儲在瀏覽器本地的一些數據。遊覽器有個很重要的特性,每次訪問服務器的時候,它都會把屬於這個服務器域名的全部cookie都帶上,發送給服務器。這是http協議的一部分。服務器能獲得每一個cookie的值。使用cookie識別「你」是有可能的:
(1)你訪問京東網jd.com,登錄,登錄成功後,服務器隨機生成一小塊數據(確保每次生成的都不重複,好比guid串),返回給瀏覽器,瀏覽器保存下來,給這塊數據起個名字叫「sessionID"。同時呢服務器上也把這個sessionID記錄下來,並與登錄帳號創建關係。
(2)隨後,你再次訪問京東,好比點擊某個商品,瀏覽器會把這塊命名爲sessionID的數據發送給京東網站,京東網站根據名字拿到這個數據,到session列表裏一查,查到這個數據了,同時根據這個數據找打關聯的帳號,這就知道,此次訪問的是 「你」。這就是session 和 cookie的關係和用處。
那超時是怎麼實現的呢,簡單,服務器在記錄sessionID的時候, 同時記錄下來你最後一次訪問服務器的時間,若是你再次訪問,和上次訪問的時間間隔超過了設定的時間,好比30分鐘,服務器就認爲,你過久沒來了,不認你這個sessionID了。你的登陸信息失效了!
若是瀏覽器禁用cookie怎麼辦(出於保護隱私目的,有的人會禁用cookie)。那網頁就把表示session的cookie記錄在內存中,每次訪問網站是,就用get方式傳給服務器(在url後加上 ?sessionID=xxxxx)(js腳本能夠判斷瀏覽器是否禁止了cookie)。

二、PSO
回過來咱們在說說ops。前面說PSO不支持session。有三個意思:
(1)PSO服務器沒有記錄你的登錄信息
(2)因此你的登錄永遠也不會超時
那問題來了,既然服務器沒有記錄你的登陸信息,那麼在PSO客戶端訪問服務器時,服務器怎麼知道來客是誰呢?這個你確定知道:PSO登陸後,把登陸信息(好比帳號)保存在客戶端內存(網頁)了。他每次訪問服務器是,老是傳給服務器(經過PO),說我胡漢三又來了。這是PSO和通常web應用區別之一:通常wen應用是將登陸信息保存在服務器端(session),客戶端和服務器端值傳送sessionid,經過sessionID在服務端查找登陸信息,PSO呢,把登錄信息保存在客戶端,每次都要傳登陸信息給服務端。這兩種作法沒有質的區別,但顯然前者更好一些,乾淨利索,不拖泥帶水。

三、PSO的問題
(1)PSO沒有統一的安全校驗機制(固然這個問題和它沒有session概念沒有關係),也就是說,服務器端沒有作訪問攔截(除了第一次登陸時驗證過一次),你這個帳號是會否登陸,是在客戶端決定的,不是在服務器決定的。只要你訪問服務器,他就接受你的請求,調用對應的後臺程序。除非你後臺程序本身作檢查。因此這個登陸基本上是沒有啥意思,你徹底能夠寫程序繞過PSO的登錄頁面。,直接訪問數據(這個沒有確認)。
這種作法,顯然經過不過安全程序的檢查。一掃描就把漏洞掃描出來了。
(2)沒法禁止重複登陸。由於他沒記錄你的登陸信息,他也無法作這個檢查。

4,如何解決和實現
以上兩個問題一塊考慮。
咱們參考通常web應用的作法,實現session,在服務器端記錄你的登陸信息,而不是在客戶端。如下是實現:
- 服務器:
登陸驗證成功後,(1)生成惟一的一段數據,經過ro返回給客戶端,命名爲sessionID。(2)檢查這個用戶是否有其餘有效的session,若是有而且不容許多點登陸,就把其餘的session刪除掉(其餘登陸再次訪問時,就失效了,被踢出去了。這個解決了PSO的第二個問題:不能禁止重複登陸)。(3)在內存或者數據庫,把這個sessionID記錄下來,並記錄和這個session關聯的帳號,該session最後一次訪問的時間(客戶端活躍時間)。
- 客戶端:
登陸成功後,(1)將收到的sessionID保存起來(保存在cookie或者內存,PSO是保存在內存,通常web應用是保存在cookie)。(2)(若是沒有保存在cookie),每次請求,在po裏吧sessionID傳給服務器;若是保存在cookie,就不用管了,瀏覽器會自動給你帶過去。
- 服務器:收到請求後,首先經過攔截器,檢查登陸是否有效:拿到客戶端傳過來的sessionID(經過cookie或者PO),在服務器上查找這個session,若是找不到,或者雖然找到可是失效了(是否超時),就定向到登陸頁面;不然執行請求的操做。

五、session 怎麼保存的問題
(1)保存在服務器內存
優勢:速度快,
缺點:(1)若是使用的負載均衡,session在多個服務器之間不能共享,須要額外的同步機制;(2)一旦服務器重啓,session就丟失了
(2)保存在數據庫
優勢:支持session共享和負載均衡;session能持久化存儲。
缺點:性能較內存session略低。
(3)保存在內存數據庫(redis)
具有前兩種的優勢。缺點是須要額外部署redis,增長系統複雜性。
redis

相關文章
相關標籤/搜索