iOS平台下cookie的使用

    xiaoxiao2025-10-20  4

    cookie我们在iOS中可以自己管理,也可以直接NSHTTPCookieStorage管理

    根据Cookies的三个基本用途,可以把它们分成三类。第一类是跟踪个人用户在特定网站上的交易,以便用户可以开始和终止交易并返回到它正在从事的工作中。Cookies的这种用途是与仅在临时内存中放置而不写入用户硬盘驱动器的Cookies相一致。交易结束后,这种Cookies可以在完成它的任务后消失。这种Cookies可以帮助顾客得到更好的在线服务,并且为交易提供方便。Cookies的第二种用途或第二种Cookies是由网站放置在用户的硬盘驱动器上,以便用户再次反问该网站时,该网站可以识别这个用户。第三类Cookies就是所谓的“第三方Cookies”,它们不是由用户使用的网站放置在用户的硬盘驱动器上的,而是诸如DoubleClick通过使用它的横幅广告,记录用户的浏览历史。而通过这些横幅广告,DoubleClick公司可以出现在11500家广告商放置广告的所有网站上.

    首先,先介绍下iOS对cookie的操作的两个类:

    帖子来源于:http://blog.csdn.net/chun799/article/details/17206907

    1. NSHTTPCookie  2. NSHTTPCookieStorage

    NSHTTPCookie对象代表一个HTTP cookie。 这是一个不可改变的对象,从一个包含cookie的属性的字典初始化,这个类可以用来手动创建cookie的Properties 。

    - (NSUInteger)version; 

    - (NSString *)name;

    - (NSString *)value;

    - (NSString *)domain;

    - (NSString *)path;

    - (BOOL)isSessionOnly;等等属性,具体属性请自行谷歌

    可以通过手工赋值的方式创建Cookie,如

    + (id)cookieWithProperties:(NSDictionary *)properties;

    - (id)initWithProperties:(NSDictionary *)properties;

    也可以从Cookie中读取到所有属性。

    - (NSDictionary *)properties;

    使用NSHTTPCookie的类方法可以将NSHTTPCookie实例与HTTP cookie header相互转换.

    根据NSHTTPCookie实例数组生成对应的HTTP cookie header

    + (NSDictionary *)requestHeaderFieldsWithCookies:(NSArray *)cookies;

    从headerFileds中读取到Cookie相关内容,生成NSHTTPCookie实例对象数组。

    + (NSArray *)cookiesWithResponseHeaderFields:(NSDictionary *)headerFields forURL:(NSURL *)theURL;

    该方法会忽略headerFileds中与cookie无关的字段,如果headerFileds中的cookie没有指定domain,则使用theURL的domain,如果没有指定path,则使用”/”.

    除非NSURLRequest明确指定不使用cookie(HTTPShouldHandleCookies设为NO),否则URL loading system会自动为NSURLRequest发送合适的存储cookie。从NSURLResponse返回的cookie也会根据当前的cookie访问策略(cookie acceptance policy)接收到系统中。

    例如:

    NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];  // 创建cookie属性字典

    [cookieProperties setObject:@"username" forKey:NSHTTPCookieName]; // 手动设置cookie的属性

    [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];  // 通过NSHTTPCookie的cookieWithProperties方法,将属性字典传入进行初始化,对象返回的是一个NSHTTPCookie对象,创建完成后进行下一步操作:

    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];  // 将手动创建返回的NSHTTPCookie对象添加到NSHTTPCookieStorage中,在iOS中使用NSHTTPCookie类封装一条cookie,通过NSHTTPCookie的方法读取到cookie的通用属性。在此声明一点:如果你的request里面明确不使用cookie,那么要讲cookie的(HTTPShouldHandleCookies设为NO),否则URL loading system会自动为NSURLRequest发送合适的存储cookie。

    下面来介绍一下NSHTTPCookieStorage对象:

    NSHTTPCookieStorage提供了管理所有NSHTTPCookie 对象的接口在OS X里,cookie是在所有程序中共享的,而在iOS中,cookie只当当前应用中有效。

    通过sharedHTTPCookieStorage方法可获取到共享的NSHTTPCookieStorage单件对象。

    + (NSHTTPCookieStorage *)sharedHTTPCookieStorage;

    使用NSHTTPCookieStorage单件对象可获取到当前存储的所有cookie

    - (NSArray *)cookies

    或针对特定URL的cookie

    - (NSArray *)cookiesForURL:(NSURL *)theURL;

    还可以添加/删除Cookie

    – deleteCookie:

    – setCookie:

    – setCookies:forURL:mainDocumentURL:

    通过NSHTTPCookieStorage可读取/修改cookie接收策略,默认为NSHTTPCookieAcceptPolicyAlways.

    - (NSHTTPCookieAcceptPolicy)cookieAcceptPolicy;

    - (void)setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)aPolicy.

    一共有三种cookie accept policy。typedef enum {

    NSHTTPCookieAcceptPolicyAlways,

    NSHTTPCookieAcceptPolicyNever,

    NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain

    }NSHTTPCookieAcceptPolicy;

    NSHTTPCookieAcceptPolicyAlways:接收所有cookie,默认策略.

    NSHTTPCookieAcceptPolicyNever: 拒绝所有cookie

    NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:只接收main document domain中的cookie.

    四.相关通知

    NSHTTPCookieManagerCookiesChangedNotification

    当NSHTTPCookieStorage实例中的cookies变化时发出此通知。

    NSHTTPCookieManagerAcceptPolicyChangedNotification

    当NSHTTPCookieStorage实例的cookie acceptance policy变化时发出此通知。

    参考:

    NSHTTPCookieStorage Class Reference

    NSHTTPCookie Class Reference

    URL Loading System Programming Guide – Cookie Storage

    以上是对这两个类的综合介绍,如果有不懂,请自行百度或谷歌。

    从网上看了一个自己手动管理cookie的例子:

    我这个操作是保存NSHTTPCookieStorage对象里的所有cookie,当然也可以使用cookieForUrl来获取cookie进行保存,方便后续的使用。此操作是在登录的时候进行。

    下面:

     这个方法就是更新cookie。在程序每次启动的时候调用一下。用来确保每次的cookie是最新的。

    然后:

     这个方法就是移除你保存的cookie了。因为你在退出账户的时候需要重新获取新的cookie,所以,你需要在退出账户的时候清空你上次保存的cookie.   大概就是这么多操作。

    staticNSString*kLocalCookieName =@"MyProjectCookie";

    staticNSString*kLocalUserData =@"MyProjectLocalUser";

    staticNSString*kServerSessionCookie =@"JSESSIONID";

    我们在工程中用的cookie是上方作用中的第二种,

    -(void)setCookies{ NSString *cookie_value; NSString *cookie_domain; NSString *cookie_name; NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL: [NSURL URLWithString:URL_LOGIN_CENTER]]; NSEnumerator *enumerat = [cookies objectEnumerator]; NSHTTPCookie *cookie; while (cookie = [enumerat nextObject]) { NSLog(@"COOKIE{name: %@, value: %@}", [cookie name], [cookie value]); // if ([[cookie name] isEqualToString:@"XXT_PSPT"]) { cookie_value = [cookie value]; // } cookie_name = [cookie name]; if ([[cookie domain]isEqualToString:@".nmgxxt.cn"]) { cookie_domain = @".xxt.cn"; }else{ cookie_domain = @".nmgxxt.cn"; } } NSLog(@"%@",cookie_value); NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary]; [cookieProperties setObject:cookie_name forKey:NSHTTPCookieName]; [cookieProperties setObject:cookie_value forKey:NSHTTPCookieValue]; [cookieProperties setObject:cookie_domain forKey:NSHTTPCookieDomain]; [cookieProperties setObject:cookie_domain forKey:NSHTTPCookieOriginURL]; [cookieProperties setObject:@"/" forKey:NSHTTPCookiePath]; // [cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion]; // [cookieProperties setObject:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];//设置失效时间 [cookieProperties setObject:@"1" forKey:NSHTTPCookieDiscard]; //设置sessionOnly NSHTTPCookie *cookieNew = [NSHTTPCookie cookieWithProperties:cookieProperties]; [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookieNew]; } 我们对cookie进行操作,对domain进行设置,以后可以识别是访问哪个。这个cookie不是自己手动操作的,他有自己的存活时间,所以我们在重登陆的时候用的是账号密码,然后成功后还会调用setCookie这个方法进行设置,从而能够再次反访问该网址

    转载请注明原文地址: https://ju.6miu.com/read-1303341.html
    最新回复(0)