Cookie 介绍
Cookie 是浏览器储存在用户电脑上的一小段文本文件。cookie 是纯文本格式,不包含任何可执行的代码。一个 Web 页面或服务器告知浏览器按照一定规范来储存这些信息,并在随后的请求中将这些信息发送至服务器。cookie 只包含数据,就其本身而言并不有害。Cookie 用来解决在无状态协议 HTTP 下,不同请求间发送持久化的数据,比如 Web 服务器如何识别不同的用户,大多数需要登录的网站在用户验证成功之后都会设置一个 cookie,只要这个 cookie 存在,用户就可以自由浏览这个网站的任意页面。
Web 服务器通过在 HTTP 响应头中添加 Set-Cookie 字段来创建一个 cookie,格式为
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
value 的一般形式为name=value
。expires 指明了 cookie 的过期时间,cookie 过期后会被删除,若不指明,cookie 则会在浏览器关闭时失效。domain 和 path 则规定了需要发送 cookie 的匹配范围。最后,secure 声明了只在 HTTPS 协议下才发送 cookie。
当设置 cookie 后,浏览器在发送请求时,在请求头中就会带上 cookie,只有 value 会被发送给服务器,其他的可选项都是用来指定浏览器的行为的。
Cookie: value1; value2; name1=value1
NSHTTPCookie
在 Foundation 框架中,通过 NSHTTPCookie 类表示了 cookie。创建方法如下:
+ cookiesWithResponseHeaderFields:forURL
+ cookieWithProperties:
- cookieWithProperties:
其中+ cookiesWithResponseHeaderFields:forURL
根据 headerFields 的 Set-Cookie 来返回 NSHTTPCookie 实例的数组,若 Set-Cookie 的值未指明 domain 和 path 时,则以 url 来设置相关属性。NSHTTPCookie
类还提供了方法
+ requestHeaderFieldsWithCookies:
用于逆向将一组NSHTTPCookie
实例转化为用于设置请求头的字典。
而另外一组创建方法则以基于 NSHTTPCookiePropertyKey 的字典为参数,其中必须提供NSHTTPCookiePath、NSHTTPCookieValue、NSHTTPCookieName、NSHTTPCookieDomain 或 NSHTTPCookieOriginURL 的值。NSHTTPCookie
类提供了相应的属性来读取对应值。
NSHTTPCookieComment
NSHTTPCookieCommentURL
// 指明 cookie 是否只在 session 内有效
NSHTTPCookieDiscard
NSHTTPCookieDomain
NSHTTPCookieExpires
NSHTTPCookieMaximumAge
NSHTTPCookieName
// 设置 cookie 的 URL
NSHTTPCookieOriginURL
NSHTTPCookiePath
NSHTTPCookiePort
NSHTTPCookieSecure
NSHTTPCookieValue
NSHTTPCookieVersion
NSHTTPCookieStorage
Foundation 框架还提供了 NSHTTPCookieStorage 类来管理 cookie 的存储。它提供了共享的单例,当然也可以单独创建新的实例
sharedHTTPCookieStorage
- initWithStorageLocation:
NSHTTPCookieStorage
实例对 cookie 的存储受枚举类型NSHTTPCookieAcceptPolicy
属性cookieAcceptPolicy
的影响,它可能的值包括:
// 默认值,接收所有 cookie
NSHTTPCookieAcceptPolicyAlways
// 拒绝所有 cookie
NSHTTPCookieAcceptPolicyNever
// 配合 NSURLRequest 中的 mainDocumentURL 属性使用
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
注意,在 iOS 中 cookie 并不在所有应用中共享,每个应用只能维护自己的 cookie。
URL Loading System 中的应用
通过 URL Loading System 发起网络请求获取数据时,可通过
NSURLSessionConfiguration
实例配置 cookie 相关选项:
// session 使用的 NSHTTPCookieStorage 实例
HTTPCookieStorage
// 指定 session 的 cookie 保存策略
HTTPCookieAcceptPolicy
// 指明请求时是否从 NSHTTPCookieStorage 获取对应的 cookie 并发送
HTTPShouldSetCookies
之后 URL Loading System 在发送请求和处理响应时,会根据配置的行为,自动的获取和发送 cookie。