最初,Http被設計成一個無狀態的,面向請求/響應的協議,因此它不能在邏輯相關的http請求/響應中保持狀態會話。因爲愈來愈多的系統使用http協議,其中包括http歷來沒有想支持的系統,好比電子商務系統。所以,http支持狀態管理就很必要了。
當時的web客戶端和服務器軟件領先者,網景(netscape)公司,最早在他們的產品中支持http狀態管理,而且制定了一些專有規範。後來,網景經過發規範草案,規範了這一機制。這些努力促成 RFC standard track制定了標準的規範。可是,如今多數的應用的狀態管理機制都在使用網景公司的規範,而網景的規範和官方規定是不兼容的。所以全部的瀏覽器開發這都被迫兼容這兩種協議,從而致使協議的不統一。 web
所謂的Http cookie就是一個token或者很短的報文信息,http代理和服務器能夠經過cookie來維持會話狀態。網景的工程師把它們稱做「magic cookie」。
HttpClient使用Cookie
接口來表明cookie。簡單說來,cookie就是一個鍵值對。通常,cookie也會包含版本號、域名、路徑和cookie有效期。
SetCookie
接口能夠表明服務器發給http代理的一個set-cookie響應頭,在瀏覽器中,這個set-cookie響應頭能夠寫入cookie,以便保持會話狀態。SetCookie2
接口對SetCookie
接口進行了拓展,添加了Set-Cookie2
方法。
ClientCookie
接口繼承了Cookie
接口,並進行了功能拓展,好比它能夠取出服務器發送過來的原始cookie的值。生成頭消息是很重要的,由於只有當cookie被指定爲Set-Cookie
或者Set-Cookie2
時,它才須要包括一些特定的屬性。 瀏覽器
兼容網景的規範,可是不兼容官方規範的cookie,是版本0. 兼容官方規範的版本,將會是版本1。版本1中的Cookie可能和版本0工做機制有差別。
下面的代碼,建立了網景版本的Cookie: 服務器
BasicClientCookie netscapeCookie = new BasicClientCookie("name", "value"); netscapeCookie.setVersion(0); netscapeCookie.setDomain(".yeetrack.com"); netscapeCookie.setPath("/");
下面的代碼,建立標準版本的Cookie。注意,標準版本的Cookie必須保留服務器發送過來的Cookie全部屬性。cookie
BasicClientCookie stdCookie = new BasicClientCookie("name", "value"); stdCookie.setVersion(1); stdCookie.setDomain(".yeetrack.com"); stdCookie.setPath("/"); stdCookie.setSecure(true); // Set attributes EXACTLY as sent by the server stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1"); stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".yeetrack.com");
下面的代碼,建立了Set-Cookie2
兼容cookie。spa
BasicClientCookie2 stdCookie = new BasicClientCookie2("name", "value"); stdCookie.setVersion(1); stdCookie.setDomain(".yeetrack.com"); stdCookie.setPorts(new int[] {80,8080}); stdCookie.setPath("/"); stdCookie.setSecure(true); // Set attributes EXACTLY as sent by the server stdCookie.setAttribute(ClientCookie.VERSION_ATTR, "1"); stdCookie.setAttribute(ClientCookie.DOMAIN_ATTR, ".yeetrack.com"); stdCookie.setAttribute(ClientCookie.PORT_ATTR, "80,8080");