1.cookie的概念
Cookie是由服務(wù)器端生成室奏,發(fā)送給User-Agent(一般是瀏覽器或者客戶端)移怯,瀏覽器會將Cookie的key/value保存到某個(gè)目錄下的文本文件內(nèi),下次請求同一網(wǎng)站地址時(shí)就發(fā)送該Cookie給服務(wù)器在使用UIWebView訪問網(wǎng)站時(shí)湖饱,經(jīng)常遇到的一個(gè)問題是需要登錄友鼻。比如訪問新浪微博,或者訪問某個(gè)個(gè)人賬號锄开,但是需要直接訪問url,卻會被重定向到登錄頁進(jìn)行登錄称诗。那么真正的瀏覽器是如何做到的直接登錄萍悴?一般來說,答案都是cookies粪狼。在你第一次登錄時(shí)退腥,網(wǎng)站設(shè)置了cookie,瀏覽器保存這些攜帶了登錄信息的cookies再榄,以后就可以直接登錄。所以我們要做的就是在url request中帶上cookies享潜。
2.蘋果系統(tǒng)中的cookie機(jī)制
因?yàn)镹SHTTPCookieStorage的默認(rèn)策略是:NSHTTPCookieAcceptPolicyAlways困鸥。當(dāng)你訪問一個(gè)網(wǎng)站時(shí),NSURLRequest都會幫你主動記錄下來你訪問的站點(diǎn)設(shè)置的cookie,如果 Cookie 存在的話疾就,會把這些信息放在 NSHTTPCookieStorage 容器中共享澜术,
當(dāng)你下次再訪問這個(gè)站點(diǎn)時(shí),NSURLRequest會拿著上次保存下來了的cookie繼續(xù)去請求猬腰。
同樣適用于ASIHTTPRequest,AFNetworking, Webview等,cookie常用于一些基于認(rèn)證的網(wǎng)絡(luò)請求
NSHTTPCookieStorage 實(shí)現(xiàn)了一個(gè)管理cookie的單例對象(只有一個(gè)實(shí)例)鸟废,每個(gè)cookie都是NSHTTPCookie類的實(shí)例,最為一個(gè)規(guī)則姑荷,cookie在所有應(yīng)用之間共享并在不同進(jìn)程之間保持同步盒延。
Session cookie(一個(gè)isSessionOnly方法返回YES的cookie)只能在單一進(jìn)程中使用。
1.獲取cookie
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
NSLog(@"%@", cookie);
}
2鼠冕、如果當(dāng)前cookie為空添寺,只要重新請求一個(gè)url
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://blog.cnrainbird.com"]
cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:3];
[NSURLConnection sendSynchronousRequest:request
returningResponse:nil
error:nil];
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
NSLog(@"%@", cookie);
}
3、清空cookie
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *_tmpArray = [NSArray arrayWithArray:[cookieJar cookies]];
for (id obj in _tmpArray) {
[cookieJar deleteCookie:obj];
}
4懈费、設(shè)置指定的cookie
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"username" forKey:NSHTTPCookieName];
[cookieProperties setObject:@"rainbird" forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieDomain];
[cookieProperties setObject:@"cnrainbird.com" forKey:NSHTTPCookieOriginURL];
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
6.UIWebView訪問網(wǎng)站時(shí)计露,經(jīng)常遇到的一個(gè)問題是需要登錄。比如訪問新浪微博憎乙,或者訪問某個(gè)個(gè)人賬號票罐,但是需要直接訪問服務(wù)器返回的某個(gè)url,卻會被重定向到登錄頁進(jìn)行登錄泞边。
1.那么真正的瀏覽器是如何做到的直接登錄该押?一般來說,答案都是cookies繁堡。
2.在你第一次登錄時(shí)沈善,網(wǎng)站設(shè)置了cookie,瀏覽器保存這些攜帶了登錄信息的cookies闻牡,以后就可以直接登錄。
3.所以我們要做的就是在url request中帶上cookies罩润。NSMutableURLRequest中提供了- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field 方法。
4.可以用來設(shè)置Http request header中的各個(gè)屬性割以。
補(bǔ)充
(1)簡單說不管是NSURLConnection還是UIWebView都會保留并傳遞服務(wù)端的cookie,重啟進(jìn)程应媚,或重啟系統(tǒng)cookie都在應(yīng)用中严沥。
(2)多個(gè)應(yīng)用間默認(rèn)是不共亨cookie的
(3)刪除重裝應(yīng)用cookie會被清除
關(guān)于ios中cookie的使用案列:ios中Cookie的使用