您的位置:首页 > Web前端

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

2014-04-02 13:42 155 查看
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这种值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: