舞陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
cookie,有時(shí)我們也用其復(fù)數(shù)形式?cookies,是服務(wù)端保存在瀏覽器端的數(shù)據(jù)片段。以?key/value的形式進(jìn)行保存。每次請求的時(shí)候,請求頭會(huì)自動(dòng)包含本網(wǎng)站此目錄下的?cookie 數(shù)據(jù)。網(wǎng)站經(jīng)常使用這個(gè)技術(shù)來識(shí)別用戶是否登陸等功能。
簡單的說,cookie 就是服務(wù)端留給計(jì)算機(jī)用戶瀏覽器端的小文件。
HTTP???是無狀態(tài)協(xié)議,服務(wù)器不能記錄瀏覽器的訪問狀態(tài),也就是說服務(wù)器不能區(qū)分中兩次請求是否由一個(gè)客戶端發(fā)出。這樣的設(shè)計(jì)嚴(yán)重阻礙的?Web?程序的設(shè)計(jì)。如:在我們進(jìn)行網(wǎng)購時(shí),買了一條褲子,又買了一個(gè)手機(jī)。由于?http?協(xié)議是無狀態(tài)的,如果不通過其他手段,服務(wù)器是不能知道用戶到底買了什么。而?Cookie?就是解決方案之一。
Cookie?實(shí)際上就是服務(wù)器保存在瀏覽器上的一段信息。瀏覽器有了?Cookie?之后,每次向服務(wù)器發(fā)送請求時(shí)都會(huì)同時(shí)將該信息發(fā)送給服務(wù)器,服務(wù)器收到請求后,就可以根據(jù)???該信息處理請求。
例如:我們上文說的網(wǎng)上商城,當(dāng)用戶向購物車中添加一個(gè)商品時(shí),服務(wù)器會(huì)將這個(gè)條信息封裝成一個(gè)?Cookie?發(fā)送給瀏覽器,瀏覽器收到Cookie,會(huì)將它保存在內(nèi)存中(注意這里的內(nèi)存是本機(jī)內(nèi)存,而不是服務(wù)器內(nèi)存),那之后每次向服務(wù)器發(fā)送請求,瀏覽器都會(huì)攜帶該?Cookie,而服務(wù)器就可以通過讀取?Cookie?來判斷用戶到底買了哪些商品。當(dāng)用戶進(jìn)行結(jié)賬操作時(shí),服務(wù)器就可以根據(jù)?Cookie?的信息來做結(jié)算。
Cookie?的用途:?網(wǎng)上商城的購物車?保持用戶登錄狀態(tài)
Cookie?的缺點(diǎn)
Cookie 做為請求或響應(yīng)報(bào)文發(fā)送,無形中增加了網(wǎng)絡(luò)流量。
Cookie 是明文傳送的安全性差。
Cookie?中保存數(shù)據(jù)是不穩(wěn)定的,用戶可以隨時(shí)清理?cookie,各個(gè)瀏覽器對?Cookie 有限制,使用上有局限
chrome?的?cookie 位置:
C:\Users\lfy\AppData\Local\Google\Chrome\User Data\Default\Cookies
ie?中?cookie?位?置?:?C:\Users\lfy\AppData\Local\Microsoft\Windows\InetCache 點(diǎn)擊設(shè)置->查看對象即可
chrome?中查看?cookie
cookie 如上圖所示
從上圖可以看出?cookie 是鍵值對的形式,有過期時(shí)間(Max-Age,session 表示在這個(gè)會(huì)話期內(nèi)有效)。
1)總的來看?Cookie?像是服務(wù)器發(fā)給瀏覽器的一張“會(huì)員卡”,瀏覽器每次向服務(wù)器發(fā)送請求時(shí)都會(huì)帶著這張“會(huì)員卡”,當(dāng)服務(wù)器看到這張“會(huì)員卡”時(shí)就可以識(shí)別瀏覽器的身份。實(shí)際上這個(gè)所謂的“會(huì)員卡”就是服務(wù)器發(fā)送的一個(gè)響應(yīng)頭:
?
2)如圖?Set-Cookie?這個(gè)響應(yīng)頭就是服務(wù)器在向服務(wù)器發(fā)“會(huì)員卡”,這個(gè)響應(yīng)頭的名字是 Set-Cookie , 后 邊 JSESSIONID=95A92EC1D7CCB4ADFC24584CB316382E 和?Path=/Test_cookie,是兩組鍵值對的結(jié)構(gòu)就是服務(wù)器為這個(gè)“會(huì)員卡”設(shè)置的信息。瀏覽器收到該信息后就會(huì)將它保存到內(nèi)存或硬盤中。
3)當(dāng)瀏覽器再次向服務(wù)器發(fā)送請求時(shí)就會(huì)攜帶這個(gè)?Cookie 信息:
cookie?是由服務(wù)端創(chuàng)建的,由瀏覽器端保存的。所以創(chuàng)建對象我們應(yīng)該在服務(wù)端創(chuàng)建?cookie,cookie 的創(chuàng)建方法:
1)創(chuàng)建一個(gè)?CookieServlet
在?Servlet?的?doPost()方法中編寫如下代碼:
//創(chuàng)建一個(gè)Cookie對象Cookie?cookie?=?new?Cookie("username",?"zhangsan");//將Cookie對象放入response對象中response.addCookie(cookie);
?
2)在瀏覽器中訪問該?Servlet,會(huì)發(fā)現(xiàn)響應(yīng)頭中出現(xiàn)如下內(nèi)容:?Set-Cookie: username=zhangsan
如此就成功的向?yàn)g覽器設(shè)置了一個(gè)?Cookie,當(dāng)我們在刷新頁面時(shí)會(huì)發(fā)現(xiàn)瀏覽器的請求頭中出現(xiàn)如下代碼:
Cookie: username=zhangsan
3)同樣我們還可以同時(shí)設(shè)置多個(gè)?Cookie:
//創(chuàng)建一個(gè)Cookie對象Cookie?cookie1?=?new?Cookie("username",?"zhangsan");? Cookie?cookie2?=?new?Cookie("password",?"123456");? Cookie?cookie3?=?new?Cookie("age",?"20");//將Cookie對象放入response對象中response.addCookie(cookie1); response.addCookie(cookie2); response.addCookie(cookie3);
瀏覽器會(huì)按以下形式發(fā)送?Cookie:
Cookie: username=zhangsan; password=123456; age=20
4)設(shè)置?Cookie?就是兩個(gè)步驟:?創(chuàng)建?Cookie 對象
將?Cookie?對象加入到?response 中
1)經(jīng)過上邊的介紹我們已經(jīng)知道?Cookie ?是存儲(chǔ)在瀏覽器中的,但是可想而知一般情況下瀏覽器不可能永遠(yuǎn)保存一個(gè)?Cookie,一來是占用硬盤空間,再來一個(gè)?Cookie 可能只在某一時(shí)刻有用沒必要長久保存。
2)?所以我們還需要為?Cookie?設(shè)置一個(gè)有效時(shí)間。
3)通過?Cookie?對象的?setMaxAge()可以設(shè)置?Cookie 的有效時(shí)間。
其中?setMaxAge()接收一個(gè)?int 型的參數(shù),來設(shè)置有效時(shí)間。參數(shù)主要有一下四種情況:
設(shè)置為?0,setMaxAge(0)
Cookie?立即失效,下次瀏覽器發(fā)送請求將不會(huì)在攜帶該?Cookie
設(shè)置大于?0,setMaxAge(60)
表示有效的秒數(shù)?60?就代表?60?秒即?1?分鐘,也就是?Cookie?在?1 分鐘后失效。
設(shè)置小于?0,setMaxAge(-1)
設(shè)置為負(fù)數(shù)表示當(dāng)前會(huì)話有效。也就是關(guān)閉瀏覽器后?Cookie 失效
不設(shè)置
如果不設(shè)置失效時(shí)間,則默認(rèn)當(dāng)前會(huì)話有效。
1)?Cookie?的路徑指告訴瀏覽器訪問那些地址時(shí)該攜帶該?Cookie,我們知道瀏覽器會(huì)保存很多不同網(wǎng)站的?Cookie,比如百度的?Cookie,新浪的?Cookie,騰訊的?Cookie?等等。那我們不可能訪問百度的時(shí)候攜帶新浪的?Cookie,也不可能訪問每個(gè)網(wǎng)站時(shí)都帶上所有的?Cookie?這是不現(xiàn)實(shí)的,所以往往我們還需要為?Cookie?設(shè)置一個(gè)?Path?屬性,來告訴瀏覽器何時(shí)攜帶該?Cookie。
2)我們同過?Cookie?的?setPath()來設(shè)置路徑,這個(gè)路徑是由瀏覽器來解析的所以/代表服務(wù)器的根目錄。
如:設(shè)置為?/項(xiàng)目名/路徑? cookie.setPath(“/項(xiàng)目名/路徑”),這樣設(shè)置只有訪問“/項(xiàng)目名/路徑”下的的資源才會(huì)攜帶?Cookie
如:/項(xiàng)目名/路徑/1.jsp 、/項(xiàng)目名/路徑/hello/2.jsp 等
如果不設(shè)置,默認(rèn)會(huì)在訪問“/項(xiàng)目名”下的資源時(shí)攜帶如:“/項(xiàng)目名/index.jsp”?、?“/項(xiàng)目名/hello/index.jsp”
Cookie?cookie?=??Cookie("username",?"abc");?cookie.setMaxAge(60*60*24);cookie.setPath(getServletContext().getContextPath()+"/");? resp.addCookie(cookie);? resp.sendRedirect(getServletContext().getContextPath()+"/index.jsp");
通過以上步驟,我們將?cookie?保存到了瀏覽器端。那么我們?nèi)绾巫x取?cookie 中的值呢。分析:
cookie?被設(shè)置進(jìn)入瀏覽器后,每次請求都會(huì)攜帶?cookie?的值,所以我們需要從?request 中取出?cookie 進(jìn)行解析。
//從request中獲取所有cookieCookie[]?cookies?=?request.getCookies();//遍歷cookiefor(Cookie?c:cookies){ String?cName?=?c.getName();//獲取cookie名String?cValue?=?c.getValue();//獲取cookie值 System.out.println("cookie:"?+?cName?+?"="?+cValue); }