Cookie 向服务器提供了追踪会话状态的能力, 同时又无须维持客户端瑟服务器之间的连接.
在浏览器客户端, Cookie 值是由服务器通过请求提供的, 然后被放到随后的请求中.
name - Cookie 的名字, 从同一 DNS 域返回的所有 Cookie 名都是唯一的. 只有 name 和 value 这两个属性才会在后续的请求中发送给服务器.
value - 由向服务器发送的下一请求返回的值
domain - 后续请求在 Cookie 中包含的 DNS 域. 比如, 拥有域值.domain1.col 的 Cookie 不应该返回给.domain2.com . 如果省略掉, 那么客户端就会将 URL 的主机名当作域. 如果域的最前面是个圆点(.), 那么 Cookie 就会返回给发送到该域及其子域的任何请求. 如果没有最前面的圆点, 那么 Cookie 就只会包含在发送给该域而非其子域的请求中.
path - path 限制发送给请求的 Cookie 都是针对指定的 URL 路径. 如果与 DNS 域搭配使用, 那么 path 属性就可以限制只会将 Cookie 发送给服务器上有限且精确的 URL 集合.
Expiration Date - Cookie 不再随请求发送的日期与时间, Cookie 会在这个时间点从客户端存储中删除
Session Only - 指定 Cookie 是在当前浏览器会话时间内返回还是一直持续到过期日期, 以二者之间先到的时间为准. 在 iOS 应用中, 会话指的是 OS 加载应用到终止应用之间的应用生命周期.
Secure - 指定 Cookie 只会用在 HTTPS 连接而非 HTTP 连接上
Comment - 用于向用户说明 Cookie 目的的注释值
Comment URL - URL 值, 向用户提供了一个 HTML 文档, 用于说明 Cookie 的目的
HTTP Only - 指示器, 告诉客户端不要与 JavaScript 应用共享 Cookie 以防止跨站脚本攻击
Version - Cookie 遵循的 HTTP Cookie 规范版本
URL 加载设施会自动处理所有 HTTP 与 HTTPS 请求的 Cookie. 会将返回的 Cookie 保存在响应中, 然后按照 Cookie 处理规则将其添加到随后的请求中. 只有在 Cookie 的 domain 属性所提供的 DNS 域中的主机才会返回 Cookie, 方便的是, 非会话 Cookie 值会在应用启动过程中进行持久化. 因此, 如果应用检索到 Cookie, 然后又终止了, 那么检索到的 Cookie 依然会出现在应用随后的调用中. URL 加载系统只会在 Cookie 没有过期并且针对目标域是有效的情况下才会发送 Cookie
URL 加载系统提供了两个重要对象以管理 Cookie : NSHTTPCookie 与 NSHTTPCookieStorage. NSHTTPCookie 通过所有必要以及可选属性来表示 Cookie. NSHTTPCookieStorage 则是单例对象, 用于管理应用的 Cookie. 注意, 与所有其他的应用数据一样, NSHTTPCookieStorage Cookie也是沙箱的, 无法在应用间共享
NSHTTPCookieStorage 可以控制保存哪些 Cookie, 不过在默认情况下, 会存储响应中返回的所有 Cookie, 无论 Cookie 的域是否匹配请求的域. 通过使用 Cookie 接受策略, 代码可以控制保存 Cookie 的程度.
存储策略值如下所示:
NSHTTPCookieAcceptPolicyAlways - 这是默认值, 表示任何返回的 Cookie 都应该被保存下来
NSHTTPCookieAcceptPolicyNever - 这个值表示不应该存储 Cookie
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain - 该策略告诉 NSHTTPCookieStorage 对象只保存域值与请求域相匹配的 Cookie
如下代码片段会阻止应用保存 Cookie.
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];对每个请求停止使用自动化的 Cookie 处理, setHTTPShouldHandleCookies:
1. 从响应中获取 Cookie
2. 删除 Cookie
deleteCookie:url: 方法接收两个参数, 分别是待删除的 Cookie 名字以及 URL(请求发出后返回 Cookie 的 URL). 确定针对某个域返回哪些 Cookie 会考虑该域的全局 cookies 以及特定主机的 Cookie.
3. 创建 Cookie
头信息(newHeaders)会被放到 HTTP 请求中以表示 Cookie. 接下来会使用包含 Cookie 信息的新头替换掉默认的头内容. 如果代码需要添加其他头信息, 那么需要在调用 setAllHTTPHeaderFieldss: 之前将其添加到 newHeaders 字典中.
与上一个示例一样, 代码首先也要创建 Cookie, 然后将其存储到应用的 Cookie 存储中. 请记住, 如果 Cookie 存储接受策略有限制, 那么 Cookie 可能不会被存储进去. 存储完 Cookie 之后, 新的请求在开始执行时会自动将其从 Cookie 存储中取出来