最初,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");