Cookie定義
百度百科是這么定義Cookie的,Cookie指某些網(wǎng)站為了辨別用戶身份葫辐、進(jìn)行 session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)。在前端開發(fā)識(shí)別用戶身份的流程如下:
- 用戶登錄成功伴郁,獲取token耿战,保存token 到本地,同事保存一份token到NSHTTPCookieStorage中蛾绎,下次在http請(qǐng)求的時(shí)候昆箕,默認(rèn)httpRequest對(duì)象會(huì)默認(rèn)帶上NSHTTPCookieStorage中保存的cookie
- 用戶在登錄成功后,服務(wù)端會(huì)把cookie設(shè)置在NSHTTPURLResponse租冠,客戶端不需要重新設(shè)置cookie鹏倘,只需要讀取
NSHTTPURLResponse
中的cookie值然后保存在本地用戶記錄用戶的登錄狀態(tài)
Cookie的作者
- 服務(wù)端
- 客戶端(原生app,h5顽爹,pc)
Cookie的基本使用
Cookie相關(guān)類
- NSHTTPCookie:cookie基本類纤泵,有以下基本屬性:
1. version:版本號(hào)
2. name:名稱
3. value:值
4. expiresDate:超時(shí)時(shí)間,注意:一定要設(shè)置,不然很可能設(shè)置的cookie無(wú)效
5. domain:設(shè)置的域名
6. path:設(shè)置路徑捏题,一般根目錄設(shè)置“/”
7. HTTPOnly:只能用做發(fā)送http請(qǐng)求玻褪,不能作用于其他用戶,保證cookie不被其他的js獲取公荧,比如你的頁(yè)面接入了第三方j(luò)s带射,如果這個(gè)js是惡意的,可以獲取cookie里面的信息循狰,那么很可能拿到用戶的私密信息窟社,所以建議使用設(shè)置HTTPOnly為YES,一般服務(wù)器在設(shè)置cookie時(shí)绪钥,也應(yīng)該設(shè)置HTTPOnly
8. secure:是否只能通過加密連接發(fā)送到受信任的服務(wù)器(即通過SSL或TLS)灿里,不應(yīng)該被交付給任何服務(wù)器,防止跨站點(diǎn)腳本漏洞的javascript應(yīng)用程序程腹。
-
NSHTTPCookieStorage:保存cookie的單利
包含了cookie的基本操作匣吊,常用的方法有設(shè)置cookie
- (void)setCookie:(NSHTTPCookie *)cookie;
刪除cookie
- (void)deleteCookie:(NSHTTPCookie *)cookie;
-
寫入Cookie
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:@".tairanmall.com" forKey:NSHTTPCookieDomain]; [dict setObject:@"/" forKey:NSHTTPCookiePath]; [dict setObject:@"token" forKey:NSHTTPCookieName]; [dict setObject:@"123" forKey:NSHTTPCookieValue]; // 過期時(shí)間為1個(gè)月 [dict setValue:[NSDate dateWithTimeIntervalSinceNow:2592000] forKey:NSHTTPCookieExpires]; [dict setObject:@"0" forKey:NSHTTPCookieVersion]; NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:dict];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
```- Cookie的讀取
NSHTTPCookieStorage *cookieStore = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie *cookie in [cookieStore cookies]) { // 獲取指定key的cookie if ([cookie.name isEqualToString:name]) { } }
在webView中設(shè)置cookie
-
UIWebView(早起的webview框架)
UIWebView設(shè)置Cookie與在http請(qǐng)求中添加的Cookie共用一套
NSHTTPCookieStorage
,所以保證設(shè)置一次即可 -
WKWebView
WKWebView相對(duì)于UIWebView寸潦,有以下優(yōu)點(diǎn)
- 內(nèi)存占用是UIWebView的1/4~1/3
- 頁(yè)面加載速度有提升色鸳,有的文章說(shuō)它的加載速度比UIWebView提升了一倍左右
- 更為細(xì)致地拆分了 UIWebViewDelegate 中的方法
- 自帶進(jìn)度條。不需要像UIWebView一樣自己做假進(jìn)度條(通過NJKWebViewProgress和雙層代理技術(shù)實(shí)現(xiàn))甸祭,技術(shù)復(fù)雜度和代碼量缕碎,根貼近實(shí)際加載進(jìn)度優(yōu)化好的多
- 允許JavaScript的Nitro庫(kù)加載并使用(UIWebView中限制)
- 可以和js直接互調(diào)函數(shù)褥影,不像UIWebView需要第三方庫(kù)WebViewJavascriptBridge來(lái)協(xié)助處理和js的交互池户。
缺點(diǎn)
- Cookie管理很麻煩,不能支持緩存頁(yè)面Cookie
- 同樣是由于進(jìn)程間通信性能問題凡怎,HTTPBody字段被丟棄
[request setHTTPMethod:@"POST"];[request setHTTPBody:[@"bodyData"dataUsingEncoding:NSUTF8StringEncoding]];[wkwebview loadRequest: request];
cookie設(shè)置注意項(xiàng)
- 必須設(shè)置過期時(shí)間:否則很容易會(huì)設(shè)置cookie后立馬就會(huì)超時(shí)
- cookie自動(dòng)丟失的問題:cookie存儲(chǔ)在NSHTTPCookieStorage中校焦,NSHTTPCookieStorage會(huì)持久化在本地,理論上只要app啟動(dòng)统倒,就可以讀取到設(shè)置過的cookie寨典,但是偶發(fā)性的cookie被丟失,丟失原因不明房匆,有相關(guān)資料顯示cookie在客戶端中五分鐘又可能存在丟失的情況耸成,這種情況比較偶發(fā),
- cookie內(nèi)存最大為4k浴鸿,不要使用過長(zhǎng)的cookie的值井氢,設(shè)置過多的cookie