欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過實例了解cookie機(jī)制特性及使用方法

 更新時間:2020年09月28日 09:39:24   作者:愛笑的berg  
這篇文章主要介紹了通過實例了解cookie機(jī)制特性及使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

會話(Session)跟蹤是Web程序中常用的技術(shù),用來跟蹤用戶的整個會話。常用的會話跟蹤技術(shù)是Cookie與Session。Cookie通過在客戶端記錄信息確定用戶身份,Session通過在服務(wù)器端記錄信息確定用戶身份。

1.1 cookie機(jī)制:

一個用戶的所有請求操作都應(yīng)該屬于同一個會話,而另一個用戶的所有請求操作則應(yīng)該屬于另一個會話,二者不能混淆。而Web應(yīng)用程序是使用HTTP協(xié)議傳輸數(shù)據(jù)的。HTTP協(xié)議是無狀態(tài)的協(xié)議。一旦數(shù)據(jù)交換完畢,客戶端與服務(wù)器端的連接就會關(guān)閉,再次交換數(shù)據(jù)需要建立新的連接。這就意味著服務(wù)器無法從連接上跟蹤會話。即用戶A購買了一件商品放入購物車內(nèi),當(dāng)再次購買商品時服務(wù)器已經(jīng)無法判斷該購買行為是屬于用戶A的會話還是用戶B的會話了。要跟蹤該會話,必須引入一種機(jī)制。Cookie就是這樣的一種機(jī)制。它可以彌補(bǔ)HTTP協(xié)議無狀態(tài)的不足。在Session出現(xiàn)之前,基本上所有的網(wǎng)站都采用Cookie來跟蹤會話。

Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社區(qū)發(fā)展的一種機(jī)制。目前Cookie已經(jīng)成為標(biāo)準(zhǔn),所有的主流瀏覽器如IE、Netscape、Firefox、Opera等都支持Cookie。由于HTTP是一種無狀態(tài)的協(xié)議,服務(wù)器單從網(wǎng)絡(luò)連接上無從知道客戶身份。怎么辦呢?就給客戶端們頒發(fā)一個通行證吧,每人一個,無論誰訪問都必須攜帶自己通行證。這樣服務(wù)器就能從通行證上確認(rèn)客戶身份了。這就是Cookie的工作原理。Cookie實際上是一小段的文本信息??蛻舳苏埱蠓?wù)器,如果服務(wù)器需要記錄該用戶狀態(tài),就使用response向客戶端瀏覽器頒發(fā)一個Cookie。客戶端瀏覽器會把Cookie保存起來。當(dāng)瀏覽器再請求該網(wǎng)站時,瀏覽器把請求的網(wǎng)址連同該Cookie一同提交給服務(wù)器。服務(wù)器檢查該Cookie,以此來辨認(rèn)用戶狀態(tài)。服務(wù)器還可以根據(jù)需要修改Cookie的內(nèi)容。
備注:Cookie功能需要瀏覽器的支持。如果瀏覽器不支持Cookie(如大部分手機(jī)中的瀏覽器)或者把Cookie禁用了,Cookie功能就會失效。不同的瀏覽器采用不同的方式保存Cookie。IE瀏覽器會在“C:\Documents and Settings\你的用戶名\Cookies”文件夾下以文本文件形式保存,一個文本文件保存一個Cookie。

1.2 cookie的特性:

1.2.1) Cookie具有不可跨域名性:

根據(jù)Cookie規(guī)范,瀏覽器訪問Google只會攜帶Google的Cookie,而不會攜帶Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。這是由Cookie的隱私安全機(jī)制決定的。
隱私安全機(jī)制能夠禁止網(wǎng)站非法獲取其他網(wǎng)站的Cookie。
注意:

a.用戶登錄網(wǎng)站www.google.com(一級域名)之后會發(fā)現(xiàn)訪問images.google.com(二級域名)時登錄信息仍然有效,而普通的Cookie是做不到的。這是因為Google做了特殊處理。

b.如果想所有helloweenvsfei.com名下的二級域名都可以使用該Cookie,需要設(shè)置Cookie的domain參數(shù),例如:

Cookie cookie = new Cookie("username","ceshi"); // 新建Cookie
cookie.setDomain(".google.com"); // 設(shè)置域名
cookie.setPath("/"); // 設(shè)置路徑
cookie.setMaxAge(Integer.MAX_VALUE); // 設(shè)置有效期
response.addCookie(cookie); // 輸出到客戶端

c.開發(fā)人員可以修改本機(jī)C:\WINDOWS\system32\drivers\etc下的hosts文件來配置多個臨時域名,然后使用operateCookie.jsp程序來設(shè)置跨域名Cookie驗證domain屬性domain參數(shù)必須以點(".")開始。另外,name相同但domain不同的兩個Cookie是兩個不同的Cookie。如果想要兩個域名完全不同的網(wǎng)站共有Cookie,可以生成兩個Cookie,domain屬性分別為兩個域名,輸出到客戶端。

1.2.2) 保存中文是需要轉(zhuǎn)碼為Unicode編碼:

中文與英文字符不同,中文屬于Unicode字符,在內(nèi)存中占4個字符,而英文屬于ASCII字符,內(nèi)存中只占2個字節(jié)。Cookie中使用Unicode字符時需要對Unicode字符進(jìn)行編碼,否則會亂碼。

備注:Cookie中保存中文只能編碼。一般使用UTF-8編碼即可。不推薦使用GBK等中文編碼,因為瀏覽器不一定支持,而且JavaScript也不支持GBK編碼。

1.2.3) 保存二進(jìn)制圖片需要使用BASE64編碼:Cookie不僅可以使用ASCII字符與Unicode字符,還可以使用二進(jìn)制數(shù)據(jù)。例如在Cookie中使用數(shù)字證書,提供安全度。使用二進(jìn)制數(shù)據(jù)時也需要進(jìn)行編碼。

備注:本程序僅用于展示Cookie中可以存儲二進(jìn)制內(nèi)容,并不實用。由于瀏覽器每次請求服務(wù)器都會攜帶Cookie,因此Cookie內(nèi)容不宜過多,否則影響速度。Cookie的內(nèi)容應(yīng)該少而精。

1.2.4)cookie有效期時間單位為秒:Cookie中通過getMaxAge()方法與setMaxAge(int maxAge)方法來讀寫maxAge屬性。

a.Cookie默認(rèn)的maxAge值為–1 如果maxAge為0,則表示刪除該Cookie。Cookie機(jī)制沒有提供刪除Cookie的方法,因此通過設(shè)置該Cookie即時失效實現(xiàn)刪除Cookie的效果。失效的Cookie會被瀏覽器從Cookie文件或者內(nèi)存中刪除,

b.如果maxAge屬性為正數(shù) 則表示該Cookie會在maxAge秒之后自動失效,瀏覽器會將maxAge為正數(shù)的Cookie持久化,即寫到對應(yīng)的Cookie文件中。無論客戶關(guān)閉了瀏覽器還是電腦,只要還在maxAge秒之
前,登錄網(wǎng)站時該Cookie仍然有效。

c.如果maxAge為負(fù)數(shù) 則表示該Cookie僅在本瀏覽器窗口以及本窗口打開的子窗口內(nèi)有效,關(guān)閉窗口后該Cookie即失效。maxAge為負(fù)數(shù)的Cookie,為臨時性Cookie,不會被持久化,不會被寫到Cookie文
件中。Cookie信息保存在瀏覽器內(nèi)存中,因此關(guān)閉瀏覽器該Cookie就消失了。

b.設(shè)置Cookie信息將永遠(yuǎn)有效

Cookie cookie = new Cookie("username","ceshi"); // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE); // 設(shè)置生命周期為MAX_VALUE
response.addCookie(cookie); // 輸出到客戶端

d.如何實現(xiàn)對cookie的修改:

response對象提供的Cookie操作方法只有一個添加操作add(Cookie cookie)。要想修改Cookie只能使用一個同名的Cookie來覆蓋原來的Cookie,達(dá)到修改的目的。刪除時只需要把maxAge修改為0即可。
備注:

a.從客戶端讀取Cookie時,包括maxAge在內(nèi)的其他屬性都是不可讀的,也不會被提交。瀏覽器提交Cookie時只會提交name與value屬性。maxAge屬性只被瀏覽器用來判斷Cookie是否過期。

b.修改、刪除Cookie時,新建的Cookie除value、maxAge之外的所有屬性,例如name、path、domain等,都要與原Cookie完全一樣。否則,瀏覽器將視為兩個不同的Cookie不予覆蓋,導(dǎo)致修改、
刪除失敗。

1.2.5)允許進(jìn)行Cookie訪問的路徑設(shè)置:

domain屬性決定運行訪問Cookie的域名,而path屬性決定允許訪問Cookie的路徑(ContextPath)。例如,如果只允許/session/下的程序使用Cookie,可以這么寫:

Cookie cookie = new Cookie("username","ceshi"); // 新建Cookie
cookie.setPath("/session/");      // 設(shè)置路徑
response.addCookie(cookie);     // 輸出到客戶端

備注:

a.設(shè)置為“/”時允許所有路徑使用Cookie。path屬性需要使用符號“/”結(jié)尾。name相同但domain相同的兩個Cookie也是兩個不同的Cookie。

b.頁面只能獲取它屬于的Path的Cookie。例如/session/test/a.jsp不能獲取到路徑為/session/abc/的Cookie。使用時一定要注意。

1.2.6)設(shè)置cookie的安全屬性:

HTTP協(xié)議不僅是無狀態(tài)的,而且是不安全的。使用HTTP協(xié)議的數(shù)據(jù)不經(jīng)過任何加密就直接在網(wǎng)絡(luò)上傳播,有被截獲的可能。使用HTTP協(xié)議傳輸很機(jī)密的內(nèi)容是一種隱患。如果不希望Cookie在HTTP等非安全協(xié)議中傳輸,可以設(shè)置Cookie的secure屬性為true。瀏覽器只會在HTTPS和SSL等安全協(xié)議中傳輸此類Cookie。下面的代碼設(shè)置secure屬性為true:

Cookie cookie = new Cookie("username", "ceshi"); // 新建Cookie
cookie.setSecure(true);      // 設(shè)置安全屬性
response.addCookie(cookie);    // 輸出到客戶端

備注:secure屬性并不能對Cookie內(nèi)容加密,因而不能保證絕對的安全性。如果需要高安全性,需要在程序中對Cookie內(nèi)容加密、解密,以防泄密。

1.2.7)不支持跨域進(jìn)行cookie窺探:

客戶端對cookie的設(shè)置: document.cookie = "CITY=" +cityCode+";domain=" + cookieDomain + ";path=/";

備注:W3C組織早就意識到JavaScript對Cookie的讀寫所帶來的安全隱患并加以防備了,W3C標(biāo)準(zhǔn)的瀏覽器會阻止JavaScript讀寫任何不屬于自己網(wǎng)站的Cookie。換句話說,A網(wǎng)站的JavaScript程序
讀寫B(tài)網(wǎng)站的Cookie不會有任何結(jié)果。

1.2.8)cookie的鍵值對屬性:

Cookie對象使用key-value屬性對的形式保存用戶狀態(tài),一個Cookie對象保存一個屬性對,一個request或者response同時使用多個Cookie。因為Cookie類位于包javax.servlet.http.*下面,所以JSP中不需要import該類。

1.3 cookie信息的獲取和賦值代碼:

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>servlet-api</artifactId>
</dependency>

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 一周 cookie的過期時間以秒為單位進(jìn)行計算
private static final int WEEK = 7 * 24 * 3600;

/*
 *根據(jù)cookie的key獲取名稱
*/
public static String getValue(HttpServletRequest request, String cookieName){
  if (StringUtils.isEmpty(cookieName)) {
    return null;
  }
  Cookie[] cookies = request.getCookies();
  if (cookies != null){
    for (int i = 0; i < cookies.length; i++) {
     if (cookieName.equalsIgnoreCase(cookies[i].getName())) {
      return cookies[i].getValue();
     }
    }
  }
  return null;
}

/*
 *設(shè)置cookie
 *maxAge
*/
public static void setCookie(HttpServletResponse response,String cookieKey,String cookieValue,int maxAge){
  Cookie namecookie = new Cookie(cookieKey,cookieValue);
  namecookie.setMaxAge(maxAge);
  response.addCookie(namecookie);
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 你什么是Elastic Stack(ELK)

    你什么是Elastic Stack(ELK)

    這篇文章主要介紹了你什么是Elastic Stack(ELK),ELK是三款軟件的簡稱,分別是Elasticsearch、Logstash、Kibana組成,需要的朋友可以參考下
    2023-04-04
  • Hadoop之Mapreduce序列化

    Hadoop之Mapreduce序列化

    本文主要帶我們了解Mapreduce序列化,序列化就是把內(nèi)存中的對象,轉(zhuǎn)換成字節(jié)序列(或其他數(shù)據(jù)傳輸協(xié)議)以便于存儲到磁盤(持久化)和網(wǎng)絡(luò)傳輸。想進(jìn)一步了解更多的小伙伴,可以參考閱讀本文
    2023-03-03
  • 分享Java常用開發(fā)編輯器工具

    分享Java常用開發(fā)編輯器工具

    這篇文章主要給大家分享了分享Java常用開發(fā)編輯器工具,文章內(nèi)容介紹非常詳細(xì),具有很大的參考價值,需要的小伙伴可以參考一下,希望對你的工作或?qū)W習(xí)有一定的幫助
    2022-03-03
  • 淺談Java當(dāng)作數(shù)組的幾個應(yīng)用場景

    淺談Java當(dāng)作數(shù)組的幾個應(yīng)用場景

    數(shù)組可以存放多個同一類型的數(shù)據(jù),可以存儲基本數(shù)據(jù)類型,引用數(shù)據(jù)類型(對象),下面這篇文章主要給大家介紹了關(guān)于Java當(dāng)作數(shù)組的幾個應(yīng)用場景,需要的朋友可以參考下
    2022-11-11
  • Java SpringSecurity入門案例與基本原理詳解

    Java SpringSecurity入門案例與基本原理詳解

    這篇文章主要介紹了java中Spring Security的實例詳解的相關(guān)資料,spring security是一個多方面的安全認(rèn)證框架,提供了基于JavaEE規(guī)范的完整的安全認(rèn)證解決方案,需要的朋友可以參考下
    2021-09-09
  • 如何使用會話Cookie和Java實現(xiàn)JWT身份驗證

    如何使用會話Cookie和Java實現(xiàn)JWT身份驗證

    這篇文章主要介紹了如何使用會話Cookie和Java實現(xiàn)JWT身份驗證,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Java動態(tài)驗證碼單線設(shè)計的兩種方法

    Java動態(tài)驗證碼單線設(shè)計的兩種方法

    這篇文章主要介紹了Java動態(tài)驗證碼單線設(shè)計的兩種方法,需要的朋友可以參考下
    2018-07-07
  • Spring用代碼來讀取properties文件實例解析

    Spring用代碼來讀取properties文件實例解析

    這篇文章主要介紹了Spring用代碼來讀取properties文件實例解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • java壓縮zip文件中文亂碼問題解決方法

    java壓縮zip文件中文亂碼問題解決方法

    這篇文章主要介紹了java壓縮zip文件中文亂碼問題的解決方法,需要的朋友可以參考下
    2014-07-07
  • Java Unsafe 類的講解

    Java Unsafe 類的講解

    這篇文章主要給大家分享了 Java Unsafe 類的講解,文章圍繞Unsafe 類的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考價值需要的朋友可以參考一下
    2021-11-11

最新評論