美文网首页iOS开发技术分享iOS进阶指南
Swift中 webView请求中添加cookie(OC同样处理

Swift中 webView请求中添加cookie(OC同样处理

作者: devchena | 来源:发表于2016-03-03 12:50 被阅读5925次

    什么是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

    相关文章

      网友评论

        本文标题:Swift中 webView请求中添加cookie(OC同样处理

        本文链接:https://www.haomeiwen.com/subject/jmankttx.html