在計算機網中經常會聽到這兩個專業術語,通常簡單的認識是Cookie能夠保存用戶登錄某個網站的帳號和密碼,Session最經典的就是保存購物車中的信息,這一點認識確定是很膚淺的。html
這裏我採集了網上我我的認爲講授的很是好的大佬們的幾個觀點。java
1. 因爲HTTP協議是無狀態的協議,因此服務端須要記錄用戶的狀態時,就須要用某種機制來識具體的用戶,這個機制就是Session.典型的場景好比購物車,當你點擊下單按鈕時,因爲HTTP協議無狀態,因此並不知道是哪一個用戶操做的,因此服務端要爲特定的用戶建立了特定的Session,用用於標識這個用戶,而且跟蹤用戶,這樣才知道購物車裏面有幾本書。這個Session是保存在服務端的,有一個惟一標識。在服務端保存Session的方法不少,內存、數據庫、文件都有。集羣的時候也要考慮Session的轉移,在大型的網站,通常會有專門的Session服務器集羣,用來保存用戶會話,這個時候 Session 信息都是放在內存的,使用一些緩存服務好比Memcached之類的來放 Session。node
2. 思考一下服務端如何識別特定的客戶?這個時候Cookie就登場了。每次HTTP請求的時候,客戶端都會發送相應的Cookie信息到服務端。實際上大多數的應用都是用 Cookie 來實現Session跟蹤的,第一次建立Session的時候,服務端會在HTTP協議中告訴客戶端,須要在 Cookie 裏面記錄一個Session ID,之後每次請求把這個會話ID發送到服務器,我就知道你是誰了。有人問,若是客戶端的瀏覽器禁用了 Cookie 怎麼辦?通常這種狀況下,會使用一種叫作URL重寫的技術來進行會話跟蹤,即每次HTTP交互,URL後面都會被附加上一個諸如 sid=xxxxx 這樣的參數,服務端據此來識別用戶。web
3. Cookie其實還能夠用在一些方便用戶的場景下,設想你某次登錄過一個網站,下次登陸的時候不想再次輸入帳號了,怎麼辦?這個信息能夠寫到Cookie裏面,訪問網站的時候,網站頁面的腳本能夠讀取這個信息,就自動幫你把用戶名給填了,可以方便一下用戶。這也是Cookie名稱的由來,給用戶的一點甜頭。因此,總結一下:Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據能夠保存在集羣、數據庫、文件中;Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。
算法
4.若是cookie裏的sessionid被其餘人發現了,好比連了不安全的 Wi-Fi ,Cookie 可能會被竊取,而後模擬用戶操做。數據庫
5.有人疑問:既然session仍是須要用到cookie,那爲何不直接就用cookie來識別用戶呢。貌似是由於cookies明文保存,很是不安全。並且cookies只能保存文本,長度有限,session保存在服務器端相對安全並且能夠存儲很是多的內容express
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之類的字符串。瀏覽器
你們請看在HTTP請求報文頭的最後一行有cookie,不過是JSessionID的cookie值緩存
Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23BE13C4C安全
好比前兩個值,應該屬於偏好設置之類的。
服務端是怎麼知道客戶端的多個請求是隸屬於一個Session呢?注意到後臺的那個jsessionid=5F4771183629C9834F8382E23BE13C4C木有?原來就是經過HTTP請求報文頭的Cookie屬性的jsessionid的值關聯起來的!(固然也能夠經過重寫URL的方式將會話ID附帶在每一個URL的後面哦)。
明白了原理,咱們就能夠很容易的分辨出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了。
http://qzone.qq.com/
http://lavasoft.blog.51cto.com/62575/275589 深刻理解HTTP Session
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
// 獲得用戶名和密碼,驗證
String u = request.getParameter("username");
String p = request.getParameter("password");
UserBeanBO ubb = new UserBeanBO();
if (ubb.checkUser(u, p))
{
// 1.把成功登錄的用戶全部信息放入session
UserBean ub = ubb.getUserBean(u);
request.getSession().setAttribute("userInfo", ub);
// 2.把購物車的信息取出
MyCartBO mcb = (MyCartBO)request.getSession().getAttribute("mycart");
ArrayList al = mcb.showMyCart();
// 把al放入request
request.setAttribute("mycartInfo", al);
// 用戶合法
request.getRequestDispatcher("success.jsp").forward(request,response);
} else
{
// 用戶不合法
request.getRequestDispatcher("error.jsp").forward(request, response);
}
}
HttpSession javax.servlet.http.HttpServletRequest.getSession()
Returns the current session associated with this request, or if the request
does not have a session, creates one.
Returns: the HttpSession associated with this request
See Also:
getSession(boolean)