如何設計分布式session?

一菱父。分布式Session的幾種實現方式

1.基于數據庫的Session共享

2.基于NFS共享文件系統(tǒng)

3.基于memcached 的session很魂,如何保證 memcached 本身的高可用性沪猴?

4. 基于Redis 的 session 共享

5. 基于cookie 進行session共享

或者是:

一悴侵、Session Replication 方式管理 (即session復制)

??????? 簡介:將一臺機器上的Session數據廣播復制到集群中其余機器上

?使用場景:機器較少舰绘,網絡流量較小

?優(yōu)點:實現簡單驼卖、配置較少、當網絡中有機器Down掉時不影響用戶訪問

?缺點:廣播式復制到其余機器有一定廷時莺治,帶來一定網絡開銷

二廓鞠、Session Sticky 方式管理

??????? 簡介:即粘性Session、當用戶訪問集群中某臺機器后产雹,強制指定后續(xù)所有請求均落到此機器上

?使用場景:機器數適中诫惭、對穩(wěn)定性要求不是非澄涛苛刻

?優(yōu)點:實現簡單蔓挖、配置方便、沒有額外網絡開銷

?缺點:網絡中有機器Down掉時馆衔、用戶Session會丟失瘟判、容易造成單點故障

三、緩存集中式管理

?????? 簡介:將Session存入分布式緩存集群中的某臺機器上角溃,當用戶訪問不同節(jié)點時先從緩存中拿Session信息

?使用場景:集群中機器數多拷获、網絡環(huán)境復雜

?優(yōu)點:可靠性好

?缺點:實現復雜、穩(wěn)定性依賴于緩存的穩(wěn)定性减细、Session信息放入緩存時要有合理的策略寫入

二匆瓜。Session和Cookie的區(qū)別和聯(lián)系以及Session的實現原理

1、session保存在服務器未蝌,客戶端不知道其中的信息驮吱;cookie保存在客戶端,服務器能夠知道其中的信息萧吠。?

2左冬、session中保存的是對象,cookie中保存的是字符串纸型。?

3拇砰、session不能區(qū)分路徑梅忌,同一個用戶在訪問一個網站期間,所有的session在任何一個地方都可以訪問到除破。而cookie中如果設置了路徑參數牧氮,那么同一個網站中不同路徑下的cookie互相是訪問不到的。?

4皂岔、session需要借助cookie才能正常工作蹋笼。如果客戶端完全禁止cookie,session將失效躁垛。

http是無狀態(tài)的協(xié)議剖毯,客戶每次讀取web頁面時,服務器都打開新的會話教馆,而且服務器也不會自動維護客戶的上下文信息逊谋,那么要怎么才能實現網上商店中的購物車呢,session就是一種保存上下文信息的機制土铺,它是針對每一個用戶的胶滋,變量的值保存在服務器端,通過SessionID來區(qū)分不同的客戶,session是以cookie或URL重寫為基礎的悲敷,默認使用cookie來實現究恤,系統(tǒng)會創(chuàng)造一個名為JSESSIONID的輸出cookie,我們叫做session cookie,以區(qū)別persistent cookies,也就是我們通常所說的cookie,注意session cookie是存儲于瀏覽器內存中的后德,并不是寫到硬盤上的部宿,這也就是我們剛才看到的JSESSIONID,我們通常情是看不到JSESSIONID的瓢湃,但是當我們把瀏覽器的cookie禁止后理张,web服務器會采用URL重寫的方式傳遞Sessionid,我們就可以在地址欄看到 sessionid=KWJHUG6JJM65HS2K6之類的字符串绵患。

明白了原理雾叭,我們就可以很容易的分辨出persistent cookies和session cookie的區(qū)別了,網上那些關于兩者安全性的討論也就一目了然了落蝙,session cookie針對某一次會話而言织狐,會話結束session cookie也就隨著消失了,而persistent cookie只是存在于客戶端硬盤上的一段文本(通常是加密的)筏勒,而且可能會遭到cookie欺騙以及針對cookie的跨站腳本攻擊移迫,自然不如 session cookie安全了。

通常session cookie是不能跨窗口使用的奏寨,當你新開了一個瀏覽器窗口進入相同頁面時起意,系統(tǒng)會賦予你一個新的sessionid,這樣我們信息共享的目的就達不到了病瞳,此時我們可以先把sessionid保存在persistent cookie中揽咕,然后在新窗口中讀出來悲酷,就可以得到上一個窗口SessionID了,這樣通過session cookie和persistent cookie的結合我們就實現了跨窗口的session tracking(會話跟蹤)亲善。

在一些web開發(fā)的書中设易,往往只是簡單的把Session和cookie作為兩種并列的http傳送信息的方式,session cookies位于服務器端蛹头,persistent cookie位于客戶端顿肺,可是session又是以cookie為基礎的,明白的兩者之間的聯(lián)系和區(qū)別渣蜗,我們就不難選擇合適的技術來開發(fā)web service了屠尊。

總之:

一、cookie機制和session機制的區(qū)別

  具體來說cookie機制采用的是在客戶端保持狀態(tài)的方案耕拷,而session機制采用的是在服務器端保持狀態(tài)的方案讼昆。

  同時我們也看到,由于在服務器端保持狀態(tài)的方案在客戶端也需要保存一個標識骚烧,所以session機制可能需要借助于cookie機制來達到保存標識的目的浸赫,但實際上還有其他選擇。

二赃绊、會話cookie和持久cookie的區(qū)別

  如果不設置過期時間既峡,則表示這個cookie生命周期為瀏覽器會話期間,只要關閉瀏覽器窗口碧查,cookie就消失了运敢。這種生命期為瀏覽會話期的cookie被稱為會話cookie。會話cookie一般不保存在硬盤上而是保存在內存里么夫。

  如果設置了過期時間者冤,瀏覽器就會把cookie保存到硬盤上肤视,關閉后再次打開瀏覽器档痪,這些cookie依然有效直到超過設定的過期時間。

  存儲在硬盤上的cookie可以在不同的瀏覽器進程間共享邢滑,比如兩個IE窗口腐螟。而對于保存在內存的cookie,不同的瀏覽器有不同的處理方式困后。

三乐纸、如何利用實現自動登錄

  當用戶在某個網站注冊后,就會收到一個惟一用戶ID的cookie摇予∑睿客戶后來重新連接時,這個用戶ID會自動返回侧戴,服務器對它進行檢查宁昭,確定它是否為注冊用戶且選擇了自動登錄跌宛,從而使用戶無需給出明確的用戶名和密碼,就可以訪問服務器上的資源积仗。

四疆拘、如何根據用戶的愛好定制站點

  網站可以使用cookie記錄用戶的意愿。對于簡單的設置寂曹,網站可以直接將頁面的設置存儲在cookie中完成定制哎迄。然而對于更復雜的定制,網站只需僅將一個惟一的標識符發(fā)送給用戶隆圆,由服務器端的數據庫存儲每個標識符對應的頁面設置漱挚。

五、cookie的發(fā)送

1.創(chuàng)建Cookie對象

2.設置最大時效

3.將Cookie放入到HTTP響應報頭

  如果你創(chuàng)建了一個cookie渺氧,并將他發(fā)送到瀏覽器棱烂,默認情況下它是一個會話級別的cookie:存儲在瀏覽器的內存中,用戶退出瀏覽器之后被刪除阶女。如果你希望瀏覽器將該cookie存儲在磁盤上颊糜,則需要使用maxAge,并給出一個以秒為單位的時間秃踩。將最大時效設為0則是命令瀏覽器刪除該 cookie衬鱼。

  發(fā)送cookie需要使用HttpServletResponse的addCookie方法,將cookie插入到一個 Set-Cookie HTTP請求報頭中憔杨。由于這個方法并不修改任何之前指定的Set-Cookie報頭鸟赫,而是創(chuàng)建新的報頭,因此我們將這個方法稱為是addCookie消别,而非setCookie抛蚤。同樣要記住響應報頭必須在任何文檔內容發(fā)送到客戶端之前設置。

六寻狂、cookie的讀取

1.調用request.getCookie

  要獲取有瀏覽器發(fā)送來的cookie岁经,需要調用HttpServletRequest的getCookies方法,這個調用返回Cookie對象的數組蛇券,對應由HTTP請求中Cookie報頭輸入的值缀壤。

2.對數組進行循環(huán),調用每個cookie的getName方法纠亚,直到找到感興趣的cookie為止

  cookie與你的主機(域)相關塘慕,而非你的servlet或JSP頁面。因而蒂胞,盡管你的servlet可能只發(fā)送了單個cookie图呢,你也可能會得到許多不相關的cookie。

例如:

  String cookieName = “userID”;

Cookie cookies[] = request.getCookies();

if (cookies!=null){

for(int i=0;i

?Cookie cookie = cookies[i];

if (cookieName.equals(cookie.getName())){

doSomethingWith(cookie.getValue());

}

}

}

七、如何使用cookie檢測初訪者

A.調用HttpServletRequest.getCookies()獲取Cookie數組

B.在循環(huán)中檢索指定名字的cookie是否存在以及對應的值是否正確

C.如果是則退出循環(huán)并設置區(qū)別標識

D.根據區(qū)別標識判斷用戶是否為初訪者從而進行不同的操作

八蛤织、使用cookie檢測初訪者的常見錯誤

  不能僅僅因為cookie數組中不存在在特定的數據項就認為用戶是個初訪者拥娄。如果cookie數組為null,客戶可能是一個初訪者瞳筏,也可能是由于用戶將cookie刪除或禁用造成的結果稚瘾。

  但是,如果數組非null,也不過是顯示客戶曾經到過你的網站或域姚炕,并不能說明他們曾經訪問過你的servlet摊欠。其它servlet、JSP頁面以及非Java Web應用都可以設置cookie柱宦,依據路徑的設置些椒,其中的任何cookie都有可能返回給用戶的瀏覽器。

  正確的做法是判斷cookie數組是否為空且是否存在指定的Cookie對象且值正確掸刊。

九免糕、使用cookie屬性的注意問題

  屬性是從服務器發(fā)送到瀏覽器的報頭的一部分;但它們不屬于由瀏覽器返回給服務器的報頭忧侧。

  因此除了名稱和值之外石窑,cookie屬性只適用于從服務器輸出到客戶端的cookie;服務器端來自于瀏覽器的cookie并沒有設置這些屬性蚓炬。

  因而不要期望通過request.getCookies得到的cookie中可以使用這個屬性松逊。這意味著抛蚁,你不能僅僅通過設置cookie的最大時效闯传,發(fā)出它,在隨后的輸入數組中查找適當的cookie,讀取它的值雇初,修改它并將它存回Cookie驯击,從而實現不斷改變的cookie值烁兰。

十、如何使用cookie記錄各個用戶的訪問計數

1.獲取cookie數組中專門用于統(tǒng)計用戶訪問次數的cookie的值

2.將值轉換成int型

3.將值加1并用原來的名稱重新創(chuàng)建一個Cookie對象

4.重新設置最大時效

5.將新的cookie輸出

十一徊都、session在不同環(huán)境下的不同含義

  session沪斟,中文經常翻譯為會話,其本來的含義是指有始有終的一系列動作/消息碟贾,比如打電話是從拿起電話撥號到掛斷電話這中間的一系列過程可以稱之為一個session币喧。

  然而當session一詞與網絡協(xié)議相關聯(lián)時轨域,它又往往隱含了“面向連接”和/或“保持狀態(tài)”這樣兩個含義袱耽。

  session在Web開發(fā)環(huán)境下的語義又有了新的擴展,它的含義是指一類用來在客戶端與服務器端之間保持狀態(tài)的解決方案干发。有時候Session也用來指這種解決方案的存儲結構朱巨。

十二、session的機制

  session機制是一種服務器端的機制枉长,服務器使用一種類似于散列表的結構(也可能就是使用散列表)來保存信息冀续。

  但程序需要為某個客戶端的請求創(chuàng)建一個session的時候琼讽,服務器首先檢查這個客戶端的請求里是否包含了一個session標識-稱為session id,如果已經包含一個session id則說明以前已經為此客戶創(chuàng)建過session,服務器就按照session id把這個session檢索出來使用(如果檢索不到洪唐,可能會新建一個钻蹬,這種情況可能出現在服務端已經刪除了該用戶對應的session對象,但用戶人為地在請求的URL后面附加上一個JSESSION的參數)凭需。

  如果客戶請求不包含session id问欠,則為此客戶創(chuàng)建一個session并且生成一個與此session相關聯(lián)的session id,這個session id將在本次響應中返回給客戶端保存粒蜈。

十三顺献、保存session id的幾種方式

A.保存session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規(guī)則把這個標識發(fā)送給服務器枯怖。

B.由于cookie可以被人為的禁止注整,必須有其它的機制以便在cookie被禁止時仍然能夠把session id傳遞回服務器,經常采用的一種技術叫做URL重寫度硝,就是把session id附加在URL路徑的后面肿轨,附加的方式也有兩種,一種是作為URL路徑的附加信息蕊程,另一種是作為查詢字符串附加在URL后面萝招。網絡在整個交互過程中始終保持狀態(tài),就必須在每個客戶端可能請求的路徑后面都包含這個session id存捺。

C.另一種技術叫做表單隱藏字段槐沼。就是服務器會自動修改表單,添加一個隱藏字段捌治,以便在表單提交時能夠把session id傳遞回服務器岗钩。

十四、session什么時候被創(chuàng)建

  一個常見的錯誤是以為session在有客戶端訪問時就被創(chuàng)建肖油,然而事實是直到某server端程序(如Servlet)調用HttpServletRequest.getSession(true)這樣的語句時才會被創(chuàng)建兼吓。

十五、session何時被刪除

session在下列情況下被刪除:

A.程序調用HttpSession.invalidate()

B.距離上一次收到客戶端發(fā)送的session id時間間隔超過了session的最大有效時間

C.服務器進程被停止

  再次注意關閉瀏覽器只會使存儲在客戶端瀏覽器內存中的session cookie失效森枪,不會使服務器端的session對象失效视搏。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市县袱,隨后出現的幾起案子浑娜,更是在濱河造成了極大的恐慌,老刑警劉巖式散,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筋遭,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機漓滔,發(fā)現死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門编饺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人响驴,你說我怎么就攤上這事透且。” “怎么了豁鲤?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵石蔗,是天一觀的道長。 經常有香客問我畅形,道長养距,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任日熬,我火速辦了婚禮棍厌,結果婚禮上,老公的妹妹穿的比我還像新娘竖席。我一直安慰自己耘纱,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布毕荐。 她就那樣靜靜地躺著束析,像睡著了一般。 火紅的嫁衣襯著肌膚如雪憎亚。 梳的紋絲不亂的頭發(fā)上员寇,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音第美,去河邊找鬼蝶锋。 笑死,一個胖子當著我的面吹牛什往,可吹牛的內容都是我干的扳缕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼别威,長吁一口氣:“原來是場噩夢啊……” “哼躯舔!你這毒婦竟也來了?” 一聲冷哼從身側響起省古,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤粥庄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后衫樊,有當地人在樹林里發(fā)現了一具尸體飒赃,經...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡利花,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年科侈,在試婚紗的時候發(fā)現自己被綠了载佳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡臀栈,死狀恐怖蔫慧,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情权薯,我是刑警寧澤姑躲,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站盟蚣,受9級特大地震影響黍析,放射性物質發(fā)生泄漏。R本人自食惡果不足惜屎开,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一阐枣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奄抽,春花似錦蔼两、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至档泽,卻和暖如春俊戳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馆匿。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工品抽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人甜熔。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓圆恤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腔稀。 傳聞我的和親對象是個殘疾皇子盆昙,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容