當前位置:編程學習大全網 - 源碼下載 - 關閉瀏覽器再打開,網站的自動登錄以功能如何實現

關閉瀏覽器再打開,網站的自動登錄以功能如何實現

Session是壹種服務器端的對象,保存在服務器端。 每個session 有壹個唯壹的session id。 session的超時也是由服務器來控制。比如,在Django的配置中就有壹項叫做SESSION_TIMEOUT的用來控制session超時時間。

而Cookie是由客戶端進行保存的,其中會保存session id這壹項,用以記錄服務器端的session. 正因為有此壹項,我們在關閉瀏覽器後再打開瀏覽器,如果cookie仍然記住了之前的session id,就導致可以自動登錄。

那麽cookie什麽情況下會記住session id,什麽情況下又記不住呢?這就要說到2種cookie:內存cookie和硬盤cookie.

Cookie分為內存Cookie(也可以說是進程中Cookie)和硬盤Cookie。大部分的session機制都使用進程中Cookie來保存session id,關閉瀏覽器後這個進程自動消失了,因此Cookie和Cookie中的session id也消失了,再次連接到服務器時無法找到原來的session. 所以,在這種情況下,就是需要再次輸入密碼登錄的。但是保存在硬盤中的cookie卻不會丟失session id,所以即使關閉瀏覽器再打開,也是仍能連得上上壹次的session,從而可以自動登錄。

又比如說,我們可以在登錄時選擇“下次自動登錄”,例如CSDN的“記住我壹周”,或者我們的購物車信息可以在切換不同瀏覽器時依然可用。這時用到的就是硬盤Cookie,此時,session id將長期保存在硬盤上的Cookie中,直到session失效為止。

除了session和cookie,還有壹個常見的服務器端配置項,在Django中叫做 SESSION_EXPIRE_AT_BROWSER_CLOSE. 望文生義,看上去將這個配置項設為True,似乎就可以做到“在重啟瀏覽器之後,必須手動輸入密碼才能登錄”了。其實不然。服務器其實並不知道瀏覽器關閉了沒有,所以關閉瀏覽器時服務器是不會刪除session的,也正是這個原因服務器才會設置壹個session的失效時間,不然服務器的資源就會被耗盡。所以當session的失效時間到了,服務器便會將相應的session刪除。而我們可以在每壹次和服務器的交互中,比如REST API請求和應答,都update當前session,比如session.modified = True, 則該session的超時時間會從當前時間點開始重新計算。

有人可能會說,服務器其實有辦法知道瀏覽器關閉了沒有。比如,在JS代碼中使用window.onclose來監控標簽頁是否關閉,然後配合 SESSION_EXPIRE_AT_BROWSER_CLOSE = True ,這樣就能夠在關閉瀏覽器的時候清除session了。這麽做基本能實現目標,但是也有壹個較大的問題:因為在壹個瀏覽器中,可能會有多個標簽頁,它們是屬於同壹個session的。當壹個標簽頁被關閉後,該session被清除,會導致所有其他標簽頁都不可用了。這不會是用戶希望得到的體驗。

回到最初的問題:關閉瀏覽器再打開,或者說重啟瀏覽器後,網站是否應該自動登錄呢?

答:其實目前有許多網站是支持重啟瀏覽器後自動登錄的,比如GitHub. 當然也有些是不支持的,比如網銀。

如果要在程序中進行控制,該怎麽做呢?筆者實驗了壹些方法,比如設置cookie的過期時間,但似乎沒什麽用;不過,可以在瀏覽器中進行控制。

比如,在Chrome的高級設置的Cookie中,有壹項叫做“僅將本地數據保留到您退出瀏覽器為止”,默認是disable的,將其enable即可實現“重啟瀏覽器,不會自動登錄”了。Firefox也有類似的設置。但是,設置這個選項也是有很大副作用的,那就是所有網站都無法自動登錄了,比如GitHub.

所以,總結壹下,“對於壹般網站來說,即使重啟瀏覽器,仍可以自動登錄”,這基本是可以接受的。理由有2點:壹、許多知名網站就是這麽做的(這似乎不是個好理由);二、服務器端對session其實還是有超時時間控制的,常見的為1小時,當然也有數天的。但是,如果想從程序而不是瀏覽器的角度,比較完美地控制是否自動登錄,筆者還沒有找到好的辦法。

  • 上一篇:智能手機有幾種系統?麻煩告訴我
  • 下一篇:什麽是SNS店鋪,什麽是API?
  • copyright 2024編程學習大全網