禁止了瀏覽器 cookie,session 還可以用嗎?
瀏覽器禁止了 cookie, session 還可以用嗎?
Session是用戶會話,那麼要實現用戶會話,伺服器端應該有個儲存會話信息的程序存在。Session的服務端服務實現由很多種,常見有磁碟文件保存(PHP默認方式,會阻塞)、MySQL(Discuz! 的自己的實現方式)、Memcached(性能較高的一種實現)、Redis。大致原理就是儲存一個獨一無二的用戶令牌(這裡暫且稱為SessionID吧)和令牌對應的用戶數據,例如這樣:
SessionID | UserID
1A6B78E7 | 195
B6SE3C66 | 0 (默認,未登陸狀態)
E135C338 | 131 (用戶將賬號密碼驗證碼和SessionID發回伺服器後,將UserID改為用戶主鍵值)
客戶端要實現Session就需要從服務端獲取一個SessionID(服務端可以用一個meta tag把SessionID發到客戶端,客戶端用js獲取,方法簡直不要太多),永久性或半永久性地保存在本地(起碼不能再開一次網頁,會話就沒了),每次訪問需要Session的頁面,就將SessionID發出。
想到這裡,難點就只有兩個了,保存和發送。主要難點是前者。
前面有人提到的URL傳參但沒有提到保存方式,永久性或半永久性地儲存,除了Cookie外還有什麼呢?Etag單頁有效並且緩存容易被衝掉,想了想,HTML5新增的LocalStorage就可實現近乎永久性的保存。(IE 8+)解決了客戶端接收和儲存這個問題,那麼發出SessionID就簡單了:1、前端模板實現的全非同步網站,在需要SessionID的請求時,使用:xhr.setRequestHeader("X-SessionID-Header", "B6SE3C66");
這樣就實現了SessionID的收發。
2、非非同步網站,粗暴的做法可以讓JS可以遍歷所有a標籤,判斷host,如果非跨域,則為其href指向鏈接追加SessionID參數,同樣實現了收發。當然也還有更加精細的做法。LocalStorage雖然不如Cookie方便,相對於Cookie來說也是有一定好處的,同域的所有頁面請求都會附加上同個Cookie,這會影響載入速度,很多網站的靜態資源都另外使用了一個域名一部分原因就是這個。LocalStorage的令牌發送是可控的,Cookie的發送是不可控的。
早幾年還沒LocalStorage的時候,我還見過有人在Cookie里保存本地草稿,提交前操作Cookie清除草稿。這兩個東西功能上可以說有些類似,因此一定程度上可以互相替代。可以。可以在url中傳遞sessionID。但是需要你在php.ini裡面開啟一個選項,就是允許在url中存在sessionID。
session 是什麼?
伺服器生成的一個 shit 值,甩給客戶端,客戶端拿著當金牌令箭,只要客戶端有辦法把這個金牌令箭告知伺服器就好了。在這樣的情況下,你怎麼傳遞這個金牌令箭,就看你的個人喜好了。
在這樣的認知下,你應該知道,怎樣使用 session 技術僅看你客戶端和伺服器溝通的方式,什麼 get post shit 隨你喜好了所以說,學東西要多想想為什麼、這樣做的原因是什麼?好處是什麼?不這麼做會怎樣?有沒有更好的設計方案?特別是搞 web 的,不能連我這個沒搞過 web 的人都不如。可以,在每條url中都加上session欄位,這種做法現在在很多老式WAP網站上依然能夠見到,因為當時的具有WAP瀏覽器的手機因為內存小的可憐無法存儲cookie。還有一種辦法就是每個頁面都加一個hidden隱藏域,value寫上session,總之方法很多,靈活變通。
ETag 已經是最要臉的追蹤手段了好嗎。。。試試 authentication cookie
&
還有 evercookie
最簡單的辦法,重新定向登陸之後網址變成http://www.xxx.com/?session=xxxxxxxxxxxxxxxx還有一個就是用戶再次點擊的問題,以前的方法是查找所有a href,form修改,這個太麻煩了。其實用referer就好了,在nginx里判斷referer有沒有session,然後處理下,應用代碼可以不做任何修改。還有這種方式容易泄露,可以跟ip,agent綁定,即session記錄操作的ip,如果ip,瀏覽器變了就重新生成session
這是我今天學Servlet寫的筆記, 剛好看見這個問題給你扒一點出來
剛接觸Web開發不到四天理解可能有偏差, 輕噴(筆記中說的身份證是SessionID號)第一: Session是什麼?
我只是補充一下:我年輕的時候做一個中國移動的論壇項目,能直接從WAP網關拿到當前請求的手機號,用來當session key再好不過了。
總結一下:1 cookie2 請求的參數中帶著(get、post)
3 HTML5的LocalStorage4 網關Session要用Cookie來維持,大部分網站伺服器默認策略就是用Cookie。
從客戶的角度來說。現在的瀏覽器,禁用Cookie其實不是完全禁用,只是失去了Cookie「持久化」的這個作用,大致可以理解為關閉窗口時清除Cookie。所以這種瀏覽器即使禁用了Cookie,照樣可以登錄網站。
對於不支持Cookie的「瀏覽器」,比如curl(不加-b,-c參數的時候),這個特性不會告訴伺服器。伺服器還是會發Set-Cookie的Header,只是客戶端忽略,那每次訪問伺服器都是一個新的Session,伺服器沒法和舊的Session關聯上。
從伺服器的角度來說,如果你覺得你的用戶的瀏覽器可能很舊,那麼你可以同時使用Cookie,表單,URL帶上用戶的Session,以防萬一么。session池是服務端存儲用戶(廣義上的用戶,可以是用戶也可以是某個客戶端非登錄用戶)的信息的集合,每個session都對應一個用戶信息,cookie是客戶端用來告知服務端,我是哪一個用戶,那麼既然cookie承擔了這麼一個功能,那麼cookie的職責一旦被禁用,那麼url也可以承擔起同樣的責任,url後面加參數,或者http頭加信息來回傳,但是如果cookie的職責這麼容易被替代的話,那他就不叫cookie了,如果說當次請求可以被替代,那麼下一次比如你直接打開瀏覽器請求淘寶網的時候或者直接手輸,不是使用cookie的話,其他的辦法的話,客戶端是不能拿出標誌你身份的東西,從而服務端並不知道你是誰。如果說瀏覽器在請求一個手輸的網址的時候,除了自動帶上cookie,還會帶其他小東西,那麼這個小東西能替代cookie,關於這一點開下chrome,觀察下network下面的http請求頭即可,我並沒有發現這樣的小東西。就憑這一點cookie還是cookie.
可以的。
session定義(來源API文檔)
Provides a way to identify a user across more than one page request or visit to a Web site and to store information about that user.
【譯文】:為用戶識別多個頁面請求或訪問Web站點,並存儲有關該用戶的信息提供一種方法。
session的實現方式有兩種
第一種:通過cookies實現。如果瀏覽器支持cookies,創建session的時候會把sessionID放在 cookies裡面;
第二種:通過重寫URL。如果瀏覽器不支持cookies,可以自己編程使用URL重寫的方式實現session(訪問頁面的時候在地址欄裡面,URL後會跟上sessionID,效果見展示圖2)。
下面做實驗驗證第二種session的實現方式:
前提:我的cookies狀態是禁用的。
通過重寫URL實現session的核心代碼如下:
out.println("&
&< a href=" + response.encodeURL( "SessionInfoServlet")
+ ">refresh& a&>");
演示對比(細節在圖中用紅色箭頭標註):
- 第一次訪問頁面結果如圖:
- 通過refresh來刷新,再次訪問本頁面效果如下圖:
當然可以用了;這個問題你首先要只要session的存儲方式,session不是只可以通過cookie存儲的啊,還可以通過url重寫的方式實現sessionId的存儲,然後提交給後台。
詳細的介紹:楊挺的博客 | Tommy#x27;s Blog
裡面有相應的code介紹。
有任何問題可以指出。
如果你看了 朴靈的深入淺出nodejs,可以通過查詢字元串實現瀏覽器端和伺服器端數據的映射,不過這個做法會暴露sessionID,風險較大。
反寫sessionId
雖然有很多方式。但應該沒有比cookie更方便了,大多網站估計禁用cookie後都無法持久會話了
之前面試有遇到過,服務端生成sessionid給客戶端,不用存cookie也是可以的
可以
推薦閱讀:
※有哪些好的wordpress中文主題原創作者?
※如何評價這篇文章中稱 WordPress 將用 Node.js 來重寫?
※php curl抓取不到頁面及來路問題?
※PHP, Python, Node.js 哪個比較適合寫爬蟲?
※28歲轉行,決定入坑IT崗位,短期幾個月先學習哪個方向合適?