swift玩轉cookie

建立NSHTTPCookie

在IOS中,每一個Cookie數據都一個NSHTTPCookie對象,那咱們就要手動建立一個NSHTTPCookie對象。ios

let cookie = NSHTTPCookie(properties: [
        NSHTTPCookieName:"username",
        NSHTTPCookieValue:"devonios.com",
        NSHTTPCookiePath:"/",
        NSHTTPCookieDomain:"http://devonios.com"])

NSHTTPCookie類有一個構造函數,參數是一個字典類型,只須要提供幾個必須的鍵便可。在DASH中,原話是這麼說的:瀏覽器

To successfully create a cookie, you must provide values for (at least) the NSHTTPCookiePath, NSHTTPCookieName, and NSHTTPCookieValue keys, and either the NSHTTPCookieOriginURL key or the NSHTTPCookieDomain key.安全

很明顯,前三個是必須的,後兩個選一個。NSHTTPCookie提供了預置的常量字符串,咱們在字典的鍵中能夠直接寫。服務器

let NSHTTPCookieComment: String
let NSHTTPCookieCommentURL: String
let NSHTTPCookieDiscard: String
let NSHTTPCookieDomain: String
let NSHTTPCookieExpires: String
let NSHTTPCookieMaximumAge: String
let NSHTTPCookieName: String
let NSHTTPCookieOriginURL: String
let NSHTTPCookiePath: String
let NSHTTPCookiePort: String
let NSHTTPCookieSecure: String
let NSHTTPCookieValue: String
let NSHTTPCookieVersion: String

須要注意的是,若是字典的格式寫錯了,那麼獲得的對象將會是nil。字典的鍵必須都是上面常量中的。cookie

有了NSHTTPCookie對象,咱們就能夠把它交給NSHTTPCookieStorage對象了,它是IOS中專門用來管理Cookie的。網絡

let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
storage.setCookie(cookie!)

經過SetCookie方法,就能夠把Cookie保存起來。ide

當程序在發送請求時,若是URl正是建立NSHTTPCookie時指定的NSHTTPCookieDomain值時,就會自動發送這個cookie了。函數

能夠寫個簡單循環來讀取下保存的Cookie內容:測試

//讀
//println(storage.cookies?.count)
let cookieArray = storage.cookies!
for cookie in cookieArray
{
    print("name:\(cookie.name),value:\(cookie.value)")
}

===========================================spa

前言

一個http請求中,咱們常常會涉及到Get請求的URL Param,POST請求的HTTP Body,Response Json,這些都是一個標準REST API標配的元素。

在一些安全驗證的API中,一般會涉及到Cookie。當用戶成功登錄後,服務器會在Response Header中寫入一個Set-Cookie字段,用來標識用戶已經登錄(受權)成功,客戶端瀏覽器接收後會把這個Cookie字段保存在客戶端本地。當客戶端再次請求API時,就會在Request Header中帶上這個Cookie值,告訴服務器:嗨,我已經受權過咯,個人cookie值是xxx,我如今要讀取一些信息,請放行~

IOS中的網絡請求

一個完整的網絡請求,須要先肯定Request URL,帶上參數,而後發送Request,而後接收Response,處理Response Data。

在IOS中,分別對應以下:

 

//Request URL
NSURL

//一個完整的Request對象
NSURLRequest

//發送請求鏈接的主要操做者
NSURLConnection

//包含返回數據的Response
NSURLResponse

 

下面是一個簡單的GET請求代碼:

 

let request = NSURLRequest(URL: NSURL(string: "http://devonios.com")!)
 NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response, nsData, error) -> Void in
            //處理返回數據nsData
}

使用Paw程序觀察HTTP請求中的Cookie

Paw是一個OS X系統下很是棒的測試HTTP REST API的程序。咱們用它來看看一個Request和Response中的Cookie是如何表現的。

Response中的Cookie:

Paw程序也是很是的智能的,當一個Response中包含了Cookie,會自動保存到默認的Cookie Jar中。

能夠在這裏看到Paw保存的Cookie:

保存的Cookie數據:

Cookie已經保存下來了,那麼當咱們再次發送一個Request時,就會自動帶上Cookie:

Cookie在哪裏

 

你可能會發現,在NSURLRequest和NSURLResponse中並無Cookie相關的方法或者屬性。

不用納悶。由於IOS爲咱們設計了一個獨立的專門用來管理Cookie數據的類:NSHTTPCookieStorage,其中一個Cookie數據對應一個NSHTTPCookie類。

NSHTTPCookie是對一個Cookie數據的封裝,以便咱們讀取Cookie內容。

其實默認狀況下,咱們能夠不用管Cookie的,若是Response中帶有Cookie,IOS會自動調用NSHTTPCookieStorage,把Cookie數據保存下來。當有新的請求時,NSURLRequest會自動帶上相應的Cookie數據。

可是,重點來了,我想讀取下Cookie呢,我想判斷下Cookie值呢?我該如何手動在Request中插入一個Cookie呢?

 

IOS安全因素,不一樣APP之間是沒法共享Cookie的。

 

NSHTTPCookieStorage讀取Cookie

首先咱們要先獲取存放Cookie數據的Storage:

 

public class func GetCookieStorage()->NSHTTPCookieStorage{
       return NSHTTPCookieStorage.sharedHTTPCookieStorage()
 }

有了Storage獲取Cookie就很簡單了:

 

public class func GetCookieArray()->[NSHTTPCookie]{
    
    let cookieStorage = GetCookieStorage()
    let cookieArray = cookieStorage.cookies
    if let arr = cookieArray{
        return cookieArray as! [NSHTTPCookie]
    }
    else{
        return []
    }
}

 

 

在這個func中,咱們經過使用NSHTTPCookieStorage的cookie對象來獲取全部Cookie,類型是一個包含NSHTTPCookie的Array。

暫停下,NSHTTPCookie是什麼鬼?它有哪些屬性和方法,我讀Cookie值該怎麼寫?別懼怕,這時該是咱們的Dash大神上場啦!

查看關於Dash介紹的文章

打開咱們的Dash,在左上角輸入NSHTTPCookie,接着就是這樣了:

徹底沒有難度:

 

/// 獲取Cookie值
public class func GetCookieByName(let cookieName:String)->String?
{
    let cookieArray:[NSHTTPCookie] = GetCookieArray()
    var value:String?
    if cookieArray.count > 0
    {
        for cookie in cookieArray
        {
            if cookie.name == cookieName
            {
                value = cookie.value
                break
            }
        }
    }
    return value
}

這個func中,咱們經過傳一個cookie名稱,即可以拿到對應的值。

關於IOS中怎麼讀cookie就這樣結束啦,很是的簡單把。

相關文章
相關標籤/搜索