现在的位置: 首页 > 综合 > 正文

iOS Cookie学习(NSHTTPCookieStorage的使用)

2018年05月12日 ⁄ 综合 ⁄ 共 3630字 ⁄ 字号 评论关闭

最近也是忙里偷闲,无意中发现了一位大牛的文章,小小的研究了一下HTTP.今天先写一点Cookie,之前有过文章都是关于Cookie的,也没有深入研究,今天也算是一起学习吧.

@interface FQWebGlobalCookies : NSObject

/*
 全局单例
 */
+ (id)globalCookiesManager;

/*
 对每份URL产生的Cookie 保存起来,以便管理
 对响应头域中的cookie进行保存
 */
- (void)storeResponseCookies:(NSDictionary *)headerFields forURL:(NSURL *)requrl;

/*
 通过requrl获取对应的cookie
 返回url所有对应的cookie
 */
- (NSArray *)getCookiesByURL:(NSURL *)requrl;

/*
 通过getCookiesByURL提取出的cookies 解释出可以被请求头域Cookie使用的字符值
 返回一个供Cookie头域使用的值,如果提取不到返回nil
 */
- (NSString *)makeCookieValueOfHeaderByCookies:(NSArray *)cookies;
- (NSString *)makeCookieValueOfHeaderByURL:(NSURL *)requrl;

/*
 通过URL清除Cookie
 */
- (void)deleteCookiesByURL:(NSURL *)requrl;
/*
 所有URL
 */
- (NSArray *)allURL;

@end

@interface FQWebGlobalCookies()
{
    NSMutableDictionary     *cookiesDictionary;
}
@end

@implementation FQWebGlobalCookies

static FQWebGlobalCookies *globalCookiesInstance = nil;

+(id)globalCookiesManager{
    if (!globalCookiesInstance) {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            globalCookiesInstance = [[FQWebGlobalCookies alloc]init];
        });
    
    }
    return globalCookiesInstance;
}

- (id)init{
    self = [super init];
    if (self) {
        cookiesDictionary = [[NSMutableDictionary alloc]init];
    }
    return self;
}

- (void)dealloc
{
    cookiesDictionary = nil;
}

/*
 对每份URL产生的Cookie 保存起来,以便管理
 对响应头域中的cookie进行保存
 */
- (void)storeResponseCookies:(NSDictionary *)headerFields forURL:(NSURL *)requrl{
    @synchronized(cookiesDictionary){
    
        NSArray *newCookies = [NSHTTPCookie cookiesWithResponseHeaderFields:headerFields forURL:requrl];
        
        if ([newCookies count] > 0) {
            NSHTTPCookie *cookie;
            NSMutableArray *globalCookies = [[NSMutableArray alloc]init];
            for (cookie in newCookies) {
                [globalCookies addObject:cookie];
            }
            
            // //如果URL相同会把旧的替换掉
            if ([globalCookies count] > 0)
            {
                [cookiesDictionary setObject:globalCookies forKey:requrl];
            }
            
            [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:newCookies forURL:requrl mainDocumentURL:nil];
        }
        
    }
}

/*
 通过requrl获取对应的cookie
 返回url所有对应的cookie
 */
- (NSArray *)getCookiesByURL:(NSURL *)requrl{

    NSArray *cookies = nil;
    @synchronized(self){
        cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage]cookiesForURL:[requrl absoluteURL]];
    }
    
    return cookies;
    
}

/*
 通过getCookiesByURL提取出的cookies 解释出可以被请求头域Cookie使用的字符值
 返回一个供Cookie头域使用的值,如果提取不到返回nil
 */
- (NSString *)makeCookieValueOfHeaderByCookies:(NSArray *)cookies{
    NSString *cookieHeader = nil;
    @synchronized(self){
        if ([cookies count] > 0) {
            NSHTTPCookie *cookie;
            for (cookies in cookies) {
                if (!cookieHeader) {
                     cookieHeader = [NSString stringWithFormat:@"%@=%@",[cookie name],[cookie value]];
                } else{
                cookieHeader = [NSString stringWithFormat: @"%@; %@=%@",cookieHeader,[cookie name],[cookie value]];
                }
            }
        }
    }
    return cookieHeader;
}

- (NSString *)makeCookieValueOfHeaderByURL:(NSURL *)requrl{
    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:[requrl absoluteURL]];
    return [self makeCookieValueOfHeaderByCookies:cookies];
    
}

/*
 通过URL清除Cookie
 */
- (void)deleteCookiesByURL:(NSURL *)requrl{
    @synchronized(self){
        NSArray *cookies = [cookiesDictionary objectForKey:requrl];
        for (NSHTTPCookie *cookie in cookies)
        {
            [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
        }
        
        [cookiesDictionary removeObjectForKey:requrl];
    }
}

/*
 所有URL
 */
- (NSArray *)allURL
{
    NSArray *urls = nil;
    @synchronized (cookiesDictionary){
        urls = [cookiesDictionary allKeys];
    }
    return urls ? urls : [NSArray array];
}
@end

抱歉!评论已关闭.