什么是Cookie
Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
更多cookie详解请见: Cookie/Session机制详解
NSHTTPCookie简单介绍:
NSHTTPCookieStorage提供了管理所有NSHTTPCookie 对象的接口。在OS X里,cookie是在所有程序中共享的,而在iOS中,cookie只当当前应用中有效。
通过sharedHTTPCookieStorage方法可获取到共享的NSHTTPCookieStorage单件对象。
+ (NSHTTPCookieStorage *)sharedHTTPCookieStorage;
使用NSHTTPCookieStorage单件对象可获取到当前存储的所有cookie
- (NSArray *)cookies
或针对特定URL的cookie
- (NSArray *)cookiesForURL:(NSURL *)theURL;
还可以添加/删除Cookie
– deleteCookie:
– setCookie:
– setCookies:forURL:mainDocumentURL:
通过NSHTTPCookieStorage可读取/修改cookie接收策略,默认为NSHTTPCookieAcceptPolicyAlways.
- (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy;
- (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)aPolicy.
一共有三种cookie accept policy。typedef enum {
NSHTTPCookieAcceptPolicyAlways,
NSHTTPCookieAcceptPolicyNever,
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
}NSHTTPCookieAcceptPolicy;
NSHTTPCookieAcceptPolicyAlways:接收所有cookie,默认策略.
NSHTTPCookieAcceptPolicyNever: 拒绝所有cookie
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只接收main document domain中的cookie.
相关通知
1.NSHTTPCookieManagerCookiesChangedNotification
当NSHTTPCookieStorage实例中的cookies变化时发出此通知。
2.NSHTTPCookieManagerAcceptPolicyChangedNotification
当NSHTTPCookieStorage实例的cookie acceptance policy变化时发出此通知。
添加cookie使用
以本人参加项目所需功能为例:由于访问wap界面时,需要传递用户信息给wap处理,此时我们选择cookie机制。
代码:
class CustomerCookie: NSObject {
// 为url绑定cookie
class func addCustomerCookie(url: NSURL) {
// 当用户登录后
if let customerEntity = LoginViewController.kCustomerEntity {
// 被传输的数据,根据项目需要自定义
var properties = [String: AnyObject]()
properties["user_token"] = customerEntity.token
properties["user_name"] = customerEntity.mobile
properties["user_mobile"] = customerEntity.mobile
properties["user_pas"] = customerEntity.password
properties["userId"] = customerEntity.customerId
var cookies = [NSHTTPCookie]()
for property in properties {
var cookieProperties = [String: AnyObject]()
// 这里我们只设置4个属性,更多属性请查阅文档
cookieProperties[NSHTTPCookieName] = property.0 // cookie名称
cookieProperties[NSHTTPCookieValue] = "\(property.1)" // NSHTTPCookieName对应的value
cookieProperties[NSHTTPCookieDomain] = url.host // 有效域名
cookieProperties[NSHTTPCookiePath] = url.path // 路径
// 创建并添加cookie
if let cookie = NSHTTPCookie(properties: cookieProperties) {
cookies.append(cookie)
}
}
// 绑定cookie到url
NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookies(cookies, forURL: url, mainDocumentURL: nil)
}
}
}
class DetailViewController: UIViewController, UIWebViewDelegate {
lazy private var webView: UIWebView = {
let webView = MTWebView(frame: self.view.bounds)
webView.delegate = self
return webView
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(self.webView)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
webView.frame = self.view.bounds
// 例如下面的url
let url = NSURL(string: "http://test.cn/jlfjdljfljaljfl")
// 一定要在webView加载之前添加cookie
CustomerCookie.addCustomerCookie(url)
self.webView.loadRequest(NSURLRequest(URL: url))
}
// MARK: UIWebViewDelegate
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if let url = request.URL {
// 拦截url
if url.absoluteString.containsString("login") { // 去登陆
self.navigationController?.pushViewController(LoginViewController(params: ["": ""]), animated: true)
return false
}
}
return true
}
func webViewDidStartLoad(webView: UIWebView) {
}
func webViewDidFinishLoad(webView: UIWebView) {
}
func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
}
}
引用链接:
http://blog.csdn.net/fangaoxin/article/details/6952954
http://www.jianshu.com/p/65094611980c。
网友评论