大家好,我是IT修真院,一枚正直純潔善良的如剛?cè)腴T(mén)的Java程序員,今天試著給大家分享一下關(guān)于cookie與session的知識(shí)概念.
1.背景介紹
web應(yīng)用程序開(kāi)發(fā)流程,中最后一個(gè)交互環(huán)節(jié)來(lái)傳輸數(shù)據(jù),使用的就是HTTP協(xié)議,但是Http協(xié)議是無(wú)狀態(tài)的,也就是說(shuō)無(wú)法對(duì)用戶(hù)的狀態(tài)進(jìn)行保存管理;簡(jiǎn)單說(shuō)就是,當(dāng)瀏覽器發(fā)送請(qǐng)求給服務(wù)器的時(shí)候,服務(wù)器響應(yīng)客戶(hù)端請(qǐng)求,但是當(dāng)同一個(gè)瀏覽器再次發(fā)送請(qǐng)求給服務(wù)器的時(shí)候,服務(wù)器并不知道它就是剛才的那個(gè)瀏覽器;服務(wù)器無(wú)法記憶,所以稱(chēng)作無(wú)狀態(tài)協(xié)議。
那么問(wèn)題來(lái)了,正是由于HTTP無(wú)狀態(tài)的協(xié)議,一旦數(shù)據(jù)交換完畢,客戶(hù)端與服務(wù)器端的連接就會(huì)關(guān)閉,再次交換數(shù)據(jù)需要建立新的連接。這就意味著服務(wù)器無(wú)法從連接上跟蹤會(huì)話;但是要跟蹤該會(huì)話,必須引入一種機(jī)制……
2.知識(shí)剖析
Cookie就是這樣的一種機(jī)制。它可以彌補(bǔ)HTTP協(xié)議無(wú)狀態(tài)的不足。在Session出現(xiàn)之前,基本上所有的網(wǎng)站都采用Cookie來(lái)跟蹤會(huì)話,session也是一樣的,都是一種會(huì)話跟蹤技術(shù),用來(lái)跟蹤用戶(hù)的整個(gè)會(huì)話;只不過(guò)Cookie通過(guò)在客戶(hù)端記錄信息確定用戶(hù)身份,Session通過(guò)在服務(wù)器端記錄信息確定用戶(hù)身份。
具體來(lái)說(shuō);Cookie是一種瀏覽器和服務(wù)器交互數(shù)據(jù)的方式;也是一種會(huì)話跟蹤技術(shù),也算是一種緩存機(jī)制,它由服務(wù)器端創(chuàng)建,但是不會(huì)保存在服務(wù)器;創(chuàng)建好之后,發(fā)送給瀏覽器。瀏覽器保存在用戶(hù)本地;下一次訪問(wèn)網(wǎng)站的時(shí)候,就會(huì)把該Cookie發(fā)送給服務(wù)器。
而session實(shí)際理解就是,從用戶(hù)打開(kāi)瀏覽器訪問(wèn)一個(gè)網(wǎng)站開(kāi)始,無(wú)論在這個(gè)網(wǎng)站中訪問(wèn)了多少頁(yè)面,點(diǎn)擊了多少鏈接,都屬于同一個(gè)會(huì)話。直到該用戶(hù)關(guān)閉瀏覽器為止,都屬于同一個(gè)會(huì)話.而會(huì)話是在服務(wù)器里的,也可以抽象理解為服務(wù)器里的一個(gè)個(gè)小盒子.這樣看的話session是服務(wù)器里的小盒子,而cookie是瀏覽器的小鑰匙;兩者匹配之后完成一次訪問(wèn)請(qǐng)求;
3.差別體現(xiàn)
Session
在服務(wù)器端保存用戶(hù)信息(保存在服務(wù)端的內(nèi)存里面)
Session中保存的是object類(lèi)型
隨會(huì)話的結(jié)束而將其存儲(chǔ)的數(shù)據(jù)銷(xiāo)毀
保存重要的信息(安全性比較高的信息)
cookie
在客戶(hù)端保存用戶(hù)信息(以文本文件的形式存在)
cookie中保存的是String類(lèi)型
cookie可以長(zhǎng)期保存在客戶(hù)端
保存不重要的用戶(hù)信息(瀏覽記錄,訪問(wèn)習(xí)慣)
4.代碼演示
設(shè)置cookie
<%
//創(chuàng)建了一個(gè)cookie,名字是"name"值是"hello"
Cookiec=newCookie("name1","hello");
//表示這個(gè)cookie可以保留一天,如果是0,表示瀏覽器一關(guān)閉就銷(xiāo)毀
c.setMaxAge(60*60*24);
//Path表示服務(wù)器的主機(jī)名,只有瀏覽器通過(guò)這個(gè)主機(jī)名訪問(wèn)服務(wù)器的時(shí)候,才會(huì)提交這個(gè)cookie到服務(wù)端
c.setPath("127.0.0.1");
//通過(guò)response把這個(gè)cookie保存在瀏覽器端
response.addCookie(c);
%>
獲取cookie
<%
//表示獲取所有瀏覽器傳遞過(guò)來(lái)的cookie
Cookie[]cookies=request.getCookies();
//如果瀏覽器端沒(méi)有任何cookie,得到的Cookie數(shù)組是null
if(null!=cookies)
//遍歷所有的cookie
for(intd=0;d<=cookies.length-1;d++) {
out.print(cookies[d].getName()+":"+cookies[d].getValue()+"
");
}
%>
設(shè)置session
<%
//session對(duì)象保存數(shù)據(jù)的方式,類(lèi)似于Map鍵值對(duì)(key-value)
session.setAttribute("name2","hi");
%>
跳轉(zhuǎn)到獲取session的頁(yè)面
獲取session
<%
//根據(jù)name取出相應(yīng)的名稱(chēng)
Stringname2=(String)session.getAttribute("name2");
%>
session中的name:<%=name2%>
5.實(shí)際應(yīng)用
if(student!=null) {
//if (student.getUser().equals(root.getUser())&& student.getPassword().equals(root.getPassword())) {
//生成token
student.setLogin_at(System.currentTimeMillis());
studentService.modify(student);
DesUtildes=newDesUtil("java");
Stringstr=student.getLogin_at()+","+student.getId();
Stringtoken=des.encrypt(str);
// String token = TokenUtil.getToken(root.getLogin_at(),root.getId());
Cookiecookie=newCookie("Token",token);
cookie.setPath("/");
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
request.getSession().setAttribute("Token",token);
return"redirect:/home";
6.參考文獻(xiàn)
http://blog.csdn.net/u011518120/article/details/52151090
https://www.cnblogs.com/fnng/archive/2012/08/14/2637279.html
http://blog.csdn.net/Jmilk/article/details/55686267?locationNum=9&fps=1
http://how2j.cn?p=13495
7.今天的分享就到這里啦,剛學(xué)沒(méi)多久,水平不夠,歡迎大家指正,拍磚~
你可以直接點(diǎn)擊此鏈接http://www.jnshu.com/login/1/15686104,觀看任務(wù)體系