讀取和設(shè)置cookie的解決方案
實際上AFNetworking中并沒有專門針對cookie封裝的代碼什湘,但是由于它底層使用的是NSURLRequest吧彪,所以可以通過NSHTTPCookieStorage來操作cookie屡谐。
并且通過webview的loadRequest方法load NSURLRequest時可以共用cookie呻疹。
參考文獻:
這篇文章寫的比較詳細黎侈,敘述了服務(wù)端以及IOS客戶端的Cookie操作烈拒。
【IOS學習】網(wǎng)絡(luò)請求中的cookie
iOS平臺下cookie的使用
iOS中的cookie簡介和其中的坑
iOS開發(fā)--http請求設(shè)置Cookie
iOS的Cookie存取看我絕對夠!陋桂!(包含了 UIwebView AFnetworking WKwebView)
這里簡述下客戶端(IOS端)COOKIE的基本操作:
獲取客戶端存儲的cookie
通過NSHTTPCookieStorage的單例類就可以獲取到之前服務(wù)端的cookie
//獲取本地cookie
NSHTTPCookieStorage *httpCookiesStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSDictionary *cookies = [httpCookiesStorage cookiesForURL:[NSURL URLWithString:@"http://localhost/"]];
for (NSHTTPCookie *cookie in cookies) {
NSLog(@"cookie:%@",cookie);
}
客戶端設(shè)置本地cookie
//客戶端設(shè)置cookie
-(void)clientSetCookie{
NSDictionary *prop1 = [NSDictionary dictionaryWithObjectsAndKeys:
@"a",NSHTTPCookieName,
@"aaa",NSHTTPCookieValue,
@"/",NSHTTPCookiePath,
[NSURL URLWithString:@"http://localhost/"],NSHTTPCookieOriginURL,
[NSDate dateWithTimeIntervalSinceNow:60],NSHTTPCookieExpires,
nil];
NSDictionary *prop2 = [NSDictionary dictionaryWithObjectsAndKeys:
@"b",NSHTTPCookieName,
@"bbb",NSHTTPCookieValue,
@"/",NSHTTPCookiePath,
[NSURL URLWithString:@"http://localhost/"],NSHTTPCookieOriginURL,
[NSDate dateWithTimeIntervalSinceNow:60],NSHTTPCookieExpires,
nil];
NSHTTPCookie *cookie1 = [NSHTTPCookie cookieWithProperties:prop1];
NSHTTPCookie *cookie2 = [NSHTTPCookie cookieWithProperties:prop2];
//單個設(shè)置
// [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie1];
// [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie2];
//批量設(shè)置
NSArray *cookies = @[cookie1,cookie2];
[[NSHTTPCookieStorage sharedHTTPCookieStorage]setCookies:cookies forURL:[NSURL URLWithString:@"http://localhost/"] mainDocumentURL:nil];
NSLog(@"設(shè)置完成");
}
說明:
- 設(shè)置好了之后逆趣,下次請求url時會自動帶入cookie中的數(shù)據(jù)
- 可以一個個設(shè)置也可以使用setCookies批量設(shè)置
刪除cookie
- (void)deleteCookie:(NSHTTPCookie *)cookie;
- (void)removeCookiesSinceDate:(NSDate *)date NS_AVAILABLE(10_10, 8_0);
我們來示范如何刪除cookie
#pragma mark -客戶端刪除cookie
//根據(jù)url和name刪除cookie
-(void)deleteCookie:(NSString *)cookieName url:(NSURL *)url{
//根據(jù)url找到所屬的cookie集合
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage]cookiesForURL:url];
for (NSHTTPCookie *cookie in cookies) {
if([cookie.name isEqualToString:cookieName]){
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
NSLog(@"刪除cookie:%@",cookieName);
}
}
}
//刪除全部cookies
-(void)deleteCookies{
for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage]cookies]) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}
NSLog(@"刪除完成");
}
cookie的本地緩存策略
//設(shè)置cookie本地緩存策略
//NSHTTPCookieAcceptPolicyAlways:保存所有cookie,這個是默認值
//NSHTTPCookieAcceptPolicyNever:不保存任何響應(yīng)頭中的cookie
//NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只保存域請求匹配的cookie
[[NSHTTPCookieStorage sharedHTTPCookieStorage]setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];
自動登錄(Cookie實現(xiàn)方法)
來自于文獻2
宏定義
staticNSString*kLocalCookieName =@"MyProjectCookie";
staticNSString*kLocalUserData =@"MyProjectLocalUser";
staticNSString*kServerSessionCookie =@"JSESSIONID";
保存登陸COOKIE
這個操作是保存NSHTTPCookieStorage對象里的所有cookie,當然也可以使用cookieForUrl來獲取cookie進行保存嗜历,方便后續(xù)的使用宣渗。此操作是在登錄的時候進行抖所。
更新Cookie
** 這個方法就是更新cookie。在程序每次啟動的時候調(diào)用一下痕囱。用來確保每次的cookie是最新的田轧。**
退出登陸 清除cookie
** 這個方法就是移除你保存的cookie了。因為你在退出賬戶的時候需要重新獲取新的cookie,所以,你需要在退出賬戶的時候清空你上次保存的cookie. **鞍恢。
cookie設(shè)置遇到的坑:
1.使用字典類型實例化NSHTTPCookie時傻粘,字典的key需要使用NSHTTPCookie.h里指定的名稱。
舉個例子需要設(shè)定一下cookie來請求url時
qingpinwo_user_test_1=c085a7f4285fc11239330c0dafd166ab0976c877b9702f93;
domain=su.qingpinwo.com;
path=job-student-web;
只能
//設(shè)置HTTP Cookie值
NSMutableDictionary *cookieProperties = [NSMutableDictionary new];
[cookieProperties setObject:@"qingpinwo_user_test_1" forKey:NSHTTPCookieName];
[cookieProperties setObject:@"c085a7f4285fc11239330c0dafd166ab0976c877b9702f93" forKey:NSHTTPCookieValue];
NSHTTPCookie *cookietemp = [NSHTTPCookie cookieWithProperties:cookieProperties];
而不能:
[cookieProperties setObject:@"c085a7f4285fc11239330c0dafd166ab0976c877b9702f93" forKey:@"qingpinwo_user_test_1"];