最近也是忙里偷闲,无意中发现了一位大牛的文章,小小的研究了一下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

iOS Cookie学习(NSHTTPCookieStorage的使用)相关推荐

  1. 开源中国iOS客户端学习

    开源中国iOS客户端学习 续写前言 <开源中国iOS客户端学习>续写前系列博客    http://blog.csdn.net/column/details/xfzl-kykhd.html ...

  2. ios开发学习-手势交互(Gesture)效果源码分享

    qianqianlianmeng ios开发学习-手势交互(Gesture)效果源码分享 All Around Pull View 介绍:实现视图四个方向(上下左右)都能够拖动更新(pull to r ...

  3. ios开发学习笔记--Core Motion

    iOS开发学习笔记之CoreMotion-运动传感器 官网文档:CoreMotion Framework Reference 一.     简介 现在的苹果手机都基本有运动传感器,能够过获取到设备的加 ...

  4. Cookie 学习案例之三天免登录

    Cookie 问题:HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁.如果第二次的请求需要使用相同的请求数据怎么办呢?难道是让用户再次请求书写吗? 解决:使用 Cookie 技术 解释 ...

  5. ios网络学习------4 UIWebView的加载本地数据的三种方式

    ios网络学习------4 UIWebView的加载本地数据的三种方式 分类: IOS2014-06-27 12:56 959人阅读 评论(0) 收藏 举报 UIWebView是IOS内置的浏览器, ...

  6. IOS之学习笔记十五(协议和委托的使用)

    1.协议和委托的使用 1).协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/809 ...

  7. 开源中国iOS客户端学习——(八)网络通信AFNetworking类库

    AFNetworking是一个轻量级的iOS网络通信类库,继ASI类库不在更新之后开发者们有一套不错选择: AFNetworking类库×××和使用教程: https://github.com/AFN ...

  8. iOS手势学习UIGestureRecognizer cocos2d 手势推荐

    iOS手势学习UIGestureRecognizer & cocos2d 手势推荐 手势识别类型: UILongPressGestureRecognizer  // 长按 UIPanGestu ...

  9. IOS开发学习笔记-----UILabel 详解

    IOS开发学习笔记-----UILabel 详解 01 //创建uilabel 02 UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMa ...

最新文章

  1. docker一:mac入门安装
  2. python流程控制-python简单流程控制
  3. linux下根据进程查找文件启动文件
  4. 【公告】百度应用开放平台关于工具/生活类应用优化展现试验的公告
  5. Qt中事件循环机制详解
  6. joi模块验证日期格式_python datetime模块详解
  7. 在Windows 7 Ultimate 64位上安装Java
  8. 数据库设计 表和表之间的三种关系
  9. esp32的MQTT物联网开发记录
  10. android hid 触摸屏驱动,针对USB接口触摸屏HID免驱触摸屏配置方法
  11. VUE之多元素组件过渡+动画封装
  12. 设置PPT幻灯版自动翻页播放
  13. Google将IP标记为中国,影响表现以及解决方案
  14. 圭尔夫大学计算机科学硕士,加拿大硕士生物医学专业介绍:圭尔夫大学
  15. 做自媒体视频剪辑为什么赚不到钱?
  16. UpdateData()函数用法
  17. PHP单例模式(Singleton Pattern)
  18. StreamUtil
  19. Three.js-材质纹理详解
  20. vc830l 说明书_数字万用表vc830l视频教程 视频

热门文章

  1. 腾讯地图api_数据库API接口的类型及应用场景
  2. mysql优化参数设置_MySQL服务优化参数设置参考
  3. 安卓键盘加上数字_Android自定义键盘的实现(数字键盘和字母键盘)
  4. node获取图片路径_使用软连接来解决 Drupal jsonapi 中 Node 节点图片相对路径的问题...
  5. dnn神经网络_机器学习-浅谈神经网络和Keras的应用
  6. 22(2)序列化以及反序列化
  7. [Swift]LeetCode732. 我的日程安排表 III | My Calendar III
  8. C# ref跟out
  9. HDU4417 Super Mario 主席树
  10. 【2017-02-19】数据类型、类型转换、常量、变量、转义符。