一。分佈式Session的幾種實現方式web
1.基於數據庫的Session共享數據庫
2.基於NFS共享文件系統
3.基於memcached 的session,如何保證 memcached 自己的高可用性?
4. 基於resin/tomcat web容器自己的session複製機制
5. 基於TT/Redis 或 jbosscache 進行 session 共享。數組
6. 基於cookie 進行session共享瀏覽器
或者是:緩存
1、Session Replication 方式管理 (即session複製)tomcat
簡介:將一臺機器上的Session數據廣播複製到集羣中其他機器上安全
使用場景:機器較少,網絡流量較小服務器
優勢:實現簡單、配置較少、當網絡中有機器Down掉時不影響用戶訪問cookie
缺點:廣播式複製到其他機器有必定廷時,帶來必定網絡開銷網絡
2、Session Sticky 方式管理
簡介:即粘性Session、當用戶訪問集羣中某臺機器後,強制指定後續全部請求均落到此機器上
使用場景:機器數適中、對穩定性要求不是很是苛刻
優勢:實現簡單、配置方便、沒有額外網絡開銷
缺點:網絡中有機器Down掉時、用戶Session會丟失、容易形成單點故障
3、緩存集中式管理
簡介:將Session存入分佈式緩存集羣中的某臺機器上,當用戶訪問不一樣節點時先從緩存中拿Session信息
使用場景:集羣中機器數多、網絡環境複雜
優勢:可靠性好
缺點:實現複雜、穩定性依賴於緩存的穩定性、Session信息放入緩存時要有合理的策略寫入
二。Session和Cookie的區別和聯繫以及Session的實現原理
一、session保存在服務器,客戶端不知道其中的信息;cookie保存在客戶端,服務器可以知道其中的信息。
二、session中保存的是對象,cookie中保存的是字符串。
三、session不能區分路徑,同一個用戶在訪問一個網站期間,全部的session在任何一個地方均可以訪問到。而cookie中若是設置了路徑參數,那麼同一個網站中不一樣路徑下的cookie互相是訪問不到的。
四、session須要藉助cookie才能正常<nobr oncontextmenu="return false;" onmousemove="kwM(3);" id="key3" onmouseover="kwE(event,3, this);" onclick="return kwC();" onmouseout="kwL(event, this);" target="_blank">工做</nobr>。若是客戶端徹底禁止cookie,session將失效。
http是無狀態的協議,客戶每次讀取web頁面時,服務器都打開新的會話,並且服務器也不會自動維護客戶的上下文信息,那麼要怎麼才能實現網上商店中的購物車呢,session就是一種保存上下文信息的機制,它是針對每個用戶的,變量的值保存在服務器端,經過SessionID來區分不一樣的客戶,session是以cookie或URL重寫爲基礎的,默認使用cookie來實現,系統會創造一個名爲JSESSIONID的輸出cookie,咱們叫作session cookie,以區別persistent cookies,也就是咱們一般所說的cookie,注意session cookie是存儲於瀏覽器內存中的,並非寫到硬盤上的,這也就是咱們剛纔看到的JSESSIONID,咱們一般情是看不到JSESSIONID的,可是當咱們把瀏覽器的cookie禁止後,web服務器會採用URL重寫的方式傳遞Sessionid,咱們就能夠在地址欄看到 sessionid=KWJHUG6JJM65HS2K6之類的字符串。
明白了原理,咱們就能夠很容易的分辨出persistent cookies和session cookie的區別了,網上那些關於二者安全性的討論也就一目瞭然了,session cookie針對某一次會話而言,會話結束session cookie也就隨着消失了,而persistent cookie只是存在於客戶端硬盤上的一段文本(一般是加密的),並且可能會遭到cookie欺騙以及針對cookie的跨站腳本攻擊,天然不如 session cookie安全了。
一般session cookie是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統會賦予你一個新的sessionid,這樣咱們信息共享的目的就達不到了,此時咱們能夠先把sessionid保存在persistent cookie中,而後在新窗口中讀出來,就能夠獲得上一個窗口SessionID了,這樣經過session cookie和persistent cookie的結合咱們就實現了跨窗口的session tracking(會話跟蹤)。
在一些web開發的書中,每每只是簡單的把Session和cookie做爲兩種並列的http傳送信息的方式,session cookies位於服務器端,persistent cookie位於客戶端,但是session又是以cookie爲基礎的,明白的二者之間的聯繫和區別,咱們就不難選擇合適的技術來開發web service了。
總之:
具體來講cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在服務器端保持狀態的方案。 同時咱們也看到,因爲在服務器端保持狀態的方案在客戶端也須要保存一個標識,因此session機制可能須要藉助於cookie機制來達到保存標識的目的,但實際上還有其餘選擇。2、會話cookie和持久cookie的區別 若是不設置過時時間,則表示這個cookie生命週期爲瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就消失了。這種生命期爲瀏覽會話期的cookie被稱爲會話cookie。會話cookie通常不保存在硬盤上而是保存在內存裏。 若是設置了過時時間,瀏覽器就會把cookie保存到硬盤上,關閉後再次打開瀏覽器,這些cookie依然有效直到超過設定的過時時間。 存儲在硬盤上的cookie能夠在不一樣的瀏覽器進程間共享,好比兩個IE窗口。而對於保存在內存的cookie,不一樣的瀏覽器有不一樣的處理方式。3、如何利用實現自動登陸 當用戶在某個網站註冊後,就會收到一個唯一用戶ID的cookie。客戶後來從新鏈接時,這個用戶ID會自動返回,服務器對它進行檢查,肯定它是否爲註冊用戶且選擇了自動登陸,從而使用戶無需給出明確的用戶名和密碼,就能夠訪問服務器上的資源。4、如何根據用戶的愛好定製站點 網站可使用cookie記錄用戶的意願。對於簡單的設置,網站能夠直接將頁面的設置存儲在cookie中完成定製。然而對於更復雜的定製,網站只需僅將一個唯一的標識符發送給用戶,由服務器端的數據庫存儲每一個標識符對應的頁面設置。5、cookie的發送1.建立Cookie對象2.設置最大時效3.將Cookie放入到HTTP響應報頭 若是你建立了一個cookie,並將他發送到瀏覽器,默認狀況下它是一個會話級別的cookie:存儲在瀏覽器的內存中,用戶退出瀏覽器以後被刪除。若是你但願瀏覽器將該cookie存儲在磁盤上,則須要使用maxAge,並給出一個以秒爲單位的時間。將最大時效設爲0則是命令瀏覽器刪除該 cookie。 發送cookie須要使用HttpServletResponse的addCookie方法,將cookie插入到一個 Set-Cookie HTTP請求報頭中。因爲這個方法並不修改任何以前指定的Set-Cookie報頭,而是建立新的報頭,所以咱們將這個方法稱爲是addCookie,而非setCookie。一樣要記住響應報頭必須在任何文檔內容發送到客戶端以前設置。6、cookie的讀取1.調用request.getCookie 要獲取有瀏覽器發送來的cookie,須要調用HttpServletRequest的getCookies方法,這個調用返回Cookie對象的數組,對應由HTTP請求中Cookie報頭輸入的值。2.對數組進行循環,調用每一個cookie的getName方法,直到找到感興趣的cookie爲止 cookie與你的主機(域)相關,而非你的servlet或JSP頁面。於是,儘管你的servlet可能只發送了單個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());}}}7、如何使用cookie檢測初訪者A.調用HttpServletRequest.getCookies()獲取Cookie數組B.在循環中檢索指定名字的cookie是否存在以及對應的值是否正確C.若是是則退出循環並設置區別標識D.根據區別標識判斷用戶是否爲初訪者從而進行不一樣的操做8、使用cookie檢測初訪者的常見錯誤 不能僅僅由於cookie數組中不存在在特定的數據項就認爲用戶是個初訪者。若是cookie數組爲null,客戶多是一個初訪者,也多是因爲用戶將cookie刪除或禁用形成的結果。 可是,若是數組非null,也不過是顯示客戶曾經到過你的網站或域,並不能說明他們曾經訪問過你的servlet。其它servlet、JSP頁面以及非Java Web應用均可以設置cookie,依據路徑的設置,其中的任何cookie都有可能返回給用戶的瀏覽器。 正確的作法是判斷cookie數組是否爲空且是否存在指定的Cookie對象且值正確。9、使用cookie屬性的注意問題 屬性是從服務器發送到瀏覽器的報頭的一部分;但它們不屬於由瀏覽器返回給服務器的報頭。 所以除了名稱和值以外,cookie屬性只適用於從服務器輸出到客戶端的cookie;服務器端來自於瀏覽器的cookie並無設置這些屬性。 於是不要指望經過request.getCookies獲得的cookie中可使用這個屬性。這意味着,你不能僅僅經過設置cookie的最大時效,發出它,在隨後的輸入數組中查找適當的cookie,讀取它的值,修改它並將它存回Cookie,從而實現不斷改變的cookie值。10、如何使用cookie記錄各個用戶的訪問計數1.獲取cookie數組中專門用於統計用戶訪問次數的cookie的值2.將值轉換成int型3.將值加1並用原來的名稱從新建立一個Cookie對象4.從新設置最大時效5.將新的cookie輸出11、session在不一樣環境下的不一樣含義 session,中文常常翻譯爲會話,其原本的含義是指善始善終的一系列動做/消息,好比打電話是從拿起電話撥號到掛斷電話這中間的一系列過程能夠稱之爲一個session。 然而當session一詞與網絡協議相關聯時,它又每每隱含了「面向鏈接」和/或「保持狀態」這樣兩個含義。 session在Web開發環境下的語義又有了新的擴展,它的含義是指一類用來在客戶端與服務器端之間保持狀態的解決方案。有時候Session也用來指這種解決方案的存儲結構。12、session的機制 session機制是一種服務器端的機制,服務器使用一種相似於散列表的結構(也可能就是使用散列表)來保存信息。 但程序須要爲某個客戶端的請求建立一個session的時候,服務器首先檢查這個客戶端的請求裏是否包含了一個session標識-稱爲session id,若是已經包含一個session id則說明之前已經爲此客戶建立過session,服務器就按照session id把這個session檢索出來使用(若是檢索不到,可能會新建一個,這種狀況可能出如今服務端已經刪除了該用戶對應的session對象,但用戶人爲地在請求的URL後面附加上一個JSESSION的參數)。 若是客戶請求不包含session id,則爲此客戶建立一個session而且生成一個與此session相關聯的session id,這個session id將在本次響應中返回給客戶端保存。十3、保存session id的幾種方式A.保存session id的方式能夠採用cookie,這樣在交互過程當中瀏覽器能夠自動的按照規則把這個標識發送給服務器。B.因爲cookie能夠被人爲的禁止,必須有其它的機制以便在cookie被禁止時仍然可以把session id傳遞迴服務器,常常採用的一種技術叫作URL重寫,就是把session id附加在URL路徑的後面,附加的方式也有兩種,一種是做爲URL路徑的附加信息,另外一種是做爲查詢字符串附加在URL後面。網絡在整個交互過程當中始終保持狀態,就必須在每一個客戶端可能請求的路徑後面都包含這個session id。C.另外一種技術叫作表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時可以把session id傳遞迴服務器。十4、session何時被建立 一個常見的錯誤是覺得session在有客戶端訪問時就被建立,然而事實是直到某server端程序(如Servlet)調用HttpServletRequest.getSession(true)這樣的語句時纔會被建立。十5、session什麼時候被刪除session在下列狀況下被刪除:A.程序調用HttpSession.invalidate()B.距離上一次收到客戶端發送的session id時間間隔超過了session的最大有效時間C.服務器進程被中止 再次注意關閉瀏覽器只會使存儲在客戶端瀏覽器內存中的session cookie失效,不會使服務器端的session對象失效