一菱父。分布式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對象失效视搏。