今天主要學習了Cookies和Session,網絡上關於這方面的知識可謂很多,讓人眼花繚亂,在此作一個小結。本文不講多,不講什么高大上的,只是拋出一塊磚,講三個問題:①什么是Cookies和Session?②為什么要用Cookies和Session;③Session什么情況下被銷毀。下一篇文章將以Java為例,簡單實踐一下。
1. 什么是Cookies,什么是Session?
關於這兩個概念,很多文章都會給你來一長串定義,balabala一大堆。其實我個人認為這兩個東東本質上做了一件事情——記錄用戶數據(也就是一小段文本)!!!比如,我們登陸論壇的時候,都是自動登陸的,這些數據就是以Cookies或Session方式給你記錄下來的。那這兩個東東有什么區別呢?最根本的:Cookies是由服務器生成,發送給客戶端瀏覽器,由瀏覽器保存;Session則保存在服務器端,當然,服務器上有許多Session對象,怎么索引,這里會生成Session ID,以Cookies的方式發送給客戶端,之后請求,服務器端就根據Session去索引Session對象,從而獲取所需信息。
關於Cookies結構及相關知識,見參考文獻:[2]。
關於Cookies和Session更多描述,見參考文獻:[1]。
2. 為什么要用這兩個東東?
個人理解:主要是為了方便用戶使用,提升用戶體驗;如果被一些流氓公司利用,做了一些不道德的事,這也讓我們很頭疼,我們只能禁用Cookies了。。。^_^。
3. Session什么時候會被銷毀?
Session,中文翻譯為會話,顧名思義,我以為Session對象是在訪問網站建立,在退出網站是銷毀的。其實我錯了!其實用戶退出瀏覽器或退出網站,雖然session ID可能找不到了(注意我這里用的是可能,假設Session ID以Cookies方式給客戶端保存,並且設定了MaxAge(最大有效時間),則SessionID將會保存到硬盤上,這樣Session ID仍然存在),但是服務器上Session對象仍然存在。只有下述三種情況會使session對象被刪除:
- 服務端程序主動刪除,即調用HttpSession.inValidate()函數;
- 距離上一次收到客戶端發送session ID的時間間隔超過session的最大有效時間;(哦,Session也是有有效時間的啊!!!)
- 服務器進程被停止。
所以,大家別被Session這個名字給誤導了~一次會話結束,不會把服務器上的Session對象刪掉的。
最后提一下:
本文講的都是一些個人理解,或者在閱讀一些知識后的總結,可能有錯,請幫忙指出,謝謝;
關於Cookies,Session其他理論問題,都可以參考文獻[1],不想再抄襲;
關於在Java中,Cookies怎么使用,怎么創建、怎么設置值、Session怎么創建、怎么設置值,等等,這些我們准備下一文具體實踐一下。
附:參考文獻
[1] cookie、session及實現記住密碼,自動登錄: http://blog.163.com/xiexueyong1987@126/blog/static/126267342201031993557704/
[2] Java之Cookie詳解:http://www.cnblogs.com/z941030/p/4742188.html
上述內容編輯於2015-08-19
下述內容編輯於2015-08-23
Cookies和Session都是用於保存用戶狀態數據的。上次我們最后說,准備在JSP下實驗以下,下面我們嵌入到JSP中的代碼如下:
1 <% 2 // 若請求對象中有Cookies,且有用戶名和密碼的Cookies,則將其寫入到 3 // 字符串中,以便后續顯示在輸入框中。 4 String userName = "", password = ""; 5 boolean isAutoLogin = false; 6 request.setCharacterEncoding("UTF8"); 7 Cookie[] cookies = request.getCookies(); 8 for (int i = 0; cookies != null && i < cookies.length; ++i) { 9 if (cookies[i].getName().equals("userName")) { 10 userName = cookies[i].getValue(); 11 } 12 13 if (cookies[i].getName().equals("password")) { 14 password = cookies[i].getValue(); 15 } 16 17 if (cookies[i].getName().equals("autoLogin")) { 18 isAutoLogin = cookies[i].getValue().equals("on"); 19 } 20 } 21 22 if (isAutoLogin == true) { 23 if (userName.equals("lijihong") && password.equals("123456789")) { 24 %> 25 <jsp:forward page="/IndexAuto.jsp"></jsp:forward> 26 <% 27 } 28 } 29 else { 30 // 若請求參數中有userName和password,則將它們放到回復對象中。 31 String userNameParam = request.getParameter("userName"); 32 String passwordParam = request.getParameter("password"); 33 String autoLoginParam = request.getParameter("autoLogin"); 34 35 if (userNameParam != null && !userNameParam.equals("")) { 36 Cookie cookie = new Cookie("userName", userNameParam); 37 response.addCookie(cookie); 38 } 39 40 if (passwordParam != null && !passwordParam.equals("")) { 41 Cookie cookie = new Cookie("password", passwordParam); 42 response.addCookie(cookie); 43 } 44 45 if (autoLoginParam != null && autoLoginParam.equals("on")) { 46 Cookie cookie = new Cookie("autoLogin", autoLoginParam); 47 cookie.setMaxAge(14 * 24 * 60 * 60); 48 response.addCookie(cookie); 49 } 50 51 if (userNameParam != null && 52 userNameParam.equals("lijihong") && 53 passwordParam != null && 54 passwordParam.equals("123456789")) { 55 %> 56 57 <jsp:forward page="/Index.jsp"></jsp:forward> 58 59 <% 60 } 61 }%>
上述代碼寫的是Cookies數據的保存和使用,Session是類似的,就不再重復了。注意,代碼中自動登錄和手動登錄跳轉頁面不一樣是為了在實驗中區分兩種登錄方式。
