Cookie在前端开发中的知识点。

Cookie的基本概念和定义:


每一个cookie在本地存储包含的内容如下:


key  名称
value 内容
expires 有效期,如果有效期超过则浏览器不会传送到服务器去,如果不指定则为0表示关闭浏览器时就会删除cookie,注意这里的时间是GMT时间格式
path   路径,指定那个路径下面的请求上传时才把这个cookie带到服务器,路径指定会对其子路径也有效.默认是根目录
domain 域名或主机名,指定访问哪些域名或主机名时才上传这个cookie,默认不指定时只有当前主机才上传cookie

例子:

username=oybq;path=/login;domain=.baidu.com

上面的意思是说只要是访问baidu.com域名并且是/login下的页面时才上传这个cookie.

username=oybq;path=/;domain=www.baidu.com;expires=2015/1/1

表示只有访问www.baidu.com的所有路径并且在2015年1/1日以前才会上传
cookie。


cookie在HTTP请求中的传输格式:

当某个cookie满足请求的路径,超时或者主机时会在http请求头中以如下形式上传到服务器

Cookie:key=value;key=value;key=value

注意这里的value是要 escape函数转码


cookie在HTTP的响应头中的传输格式:
服务器有cookie下发时以如下格式下发

Set-Cookie:key=value;expires=可选的 GMT格式表示的时间,如果是0或者不指定则表示不保存cookie;path=可选的路径;domain=可选的主机名或者域名域名以.开头,如果不指定则为当前主机
Set-Cookie:….
Set-Cookie….

如果是多个cookie则要返回多个Set-Cookie

比如:
Set-Cookie BAIDUID=DF; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/; domain=.baidu.com
Set-Cookie BDSVRTM=0; path=/
Set-Cookie H_PS_PSSID=4678; path=/; domain=.baidu.com


浏览器要根据响应头中的cookie来决定哪些需要存储,以及存储的内容,响应头中的cookie是经过转码的,因此客户端收到后要注意转码


IOSCookie类:

Cookie可以分为两类,会话Cookie和持久Cookie,会话Cookie是临时Cookie,当前会话结束(浏览器退出)时Cookie会被删除。持久Cookie会存储在用户的硬盘上,浏览器退出,然后重新启动后Cookie仍然存在。会话Cookie和持久Cookie的区别在于过期时间,如果设置了Discard参数(Cookie 版本1)或者没有设置Expires(Cookie版本0)或Max-Age(Cookie版本1)设置过期时间,则此Cookie为会话Cookie

Cookie有两个版本,一个是版本0(Netscape Cookies)和版本1(RFC 2965),目前大多数服务器使用的Cookie 0。



NSHTTPCookie 类描述每个具体的cookie,


1.cookie的建立,


- (id)initWithProperties:(NSDictionary *)properties;

+ (id)cookieWithProperties:(NSDictionary *)properties;


这个字典是描述cookie的各种属性的,其中的key 有如下:



FOUNDATION_EXPORT NSString * const NSHTTPCookieName;



FOUNDATION_EXPORT NSString * const NSHTTPCookieValue;


//和Domain二选1

FOUNDATION_EXPORT NSString * const NSHTTPCookieOriginURL;


//和OriginURL二选1

FOUNDATION_EXPORT NSString * const NSHTTPCookieDomain;


//必选,默认是"/"

FOUNDATION_EXPORT NSString * const NSHTTPCookiePath;


//String型,0或者1,1为会话cookie,0为永久cookie,默认为0

FOUNDATION_EXPORT NSString * const NSHTTPCookieVersion;


//String型TRUE FALSE

FOUNDATION_EXPORT NSString * const NSHTTPCookieSecure; 


//日期型NSDate,只在为0是需要设置

FOUNDATION_EXPORT NSString * const NSHTTPCookieExpires;


//可选,表示在会话内的有效时间,单位为秒。

FOUNDATION_EXPORT NSString * const NSHTTPCookieMaximumAge;



//从响应头字典里面得到cookie数组,这个是在HTTP响应头里面,响应头可以包括其他字典信息,但只会解析Set-Cookie部分。

+ (NSArray *)cookiesWithResponseHeaderFields:(NSDictionary *)headerFields forURL:(NSURL *)URL;


//根据cookie数组得到http请求头的cookie部分的值,得到字典中只有一个kv对

+ (NSDictionary *)requestHeaderFieldsWithCookies:(NSArray *)cookies;


//其他方法是都是得到cookie的属性的,有一个特殊属性就是是否会话有效,如果是则表示不保存关闭浏览器就没有。



NSHTTPCookieStorage 读取和保存应用内的cookie信息。



+ (NSHTTPCookieStorage *)sharedHTTPCookieStorage;

- (NSArray *)cookies;

- (void)setCookie:(NSHTTPCookie *)cookie;

- (void)deleteCookie:(NSHTTPCookie *)cookie;

- (NSArray *)cookiesForURL:(NSURL *)URL;  //根据地址得到数组,这个函数的返回用于requestHeaderFieldsWithCookies的调用


//这个主要是在NSURLRequest中有一个设置主文档URL的地方,表示对于响应的URL中的跟主文档URL相同域的响应头中的cookie进行保存,

这个函数一般不用自己调用。

- (void)setCookies:(NSArray *)cookies forURL:(NSURL *)URL mainDocumentURL:(NSURL *)mainDocumentURL;



//设置获取接收策略

- (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)cookieAcceptPolicy;


 NSHTTPCookieAcceptPolicyAlways:接收所有cookie,默认策略.

NSHTTPCookieAcceptPolicyNever: 拒绝所有cookie
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只接收main document domain中的cookie.


NSHTTPCookieManagerCookiesChangedNotification
当NSHTTPCookieStorage实例中的cookies变化时发出此通知。接收到通知是的object是 NSHTTPCookieStorage对象。,实际测试的结果是只要设置就会激发。



只要通过NSURLRequest来请求网络时系统都会根据设置来决定是否自动带上cookie信息,这个可以通过设置则

- (void)setHTTPShouldHandleCookies:(BOOL)should;

来决定请求时要不要带上cookie信息,默认是YES表示请求时会默认带上cookie信息。




JavaScript Cookie的使用:

设置cookie的值

document.cookie="key=value;key=value; path=路径;domain=主机;expires=GMT时间"

如果value中有特殊值需要调用 escape()函数来转码。,这个函数可以设置多个key=value而后面跟可选的其他参数,

//设置一个30天有效的cookie

var exp = new Date(); //new Date("December 31, 9998");

  exp.setTime(exp.getTime() + 30*24*60*60*1000);

 document.cookie="mytest=mytest;domain=.baidu.com;expires="+exp.toGMTString();



对调用document.cookie=时是以key,path,domain作为一个cookie的唯一标识的,如果设置时这些值都一样则重新设置某个cookie的值,如果要删除某个cookie值,则只需要把这个cookie的expires设置为一个过去的时间就可以了。

//获取当前时间
var date=new Date();
//将date设置为过去的时间
date.setTime(date.getTime()-10000);
//将userId这个cookie删除
document.cookie="userId=828; expire="+date.toGMTString();

服务端也是可以响应一个值为空并且时间为0值来删除cookie


获取cookie值就通过document.cookie,这个函数会得到本主机支持的所有cookie,只会返回key=value;key=value这种值。




你可能感兴趣的:(前端开发,IOS,Android)