cookie设置、userAgent设置

cookie 设置以键值对的形式存在,name---value。 一个apple内部可以设置多个cookie,设置cookie以及获取cookie的方式如下:

设置cookie:

+(void)setCookieWithDict{
// 字典中的键值对为设置cookie中的name 以及value
    NSDictionary* cookiePropertys = @{@"esales_app_flag":@"PSS_ESALES_PFS_SMTS",@"app_flag":@"Y"};
    [self setCookieValueWithDic:cookiePropertys];
}

+ (void)setCookieValueWithDic:(NSDictionary*)cookiePropertys{
    for (NSString*key in cookiePropertys.allKeys) {
        NSString* value = cookiePropertys[key];
        NSMutableDictionary* cookieProperties =[NSMutableDictionary dictionary];
//根据键值设置当前cookie对应name 和value
        [cookieProperties setObject:key forKey:NSHTTPCookieName];
        [cookieProperties setObject:value forKey:NSHTTPCookieValue];
        [cookieProperties setObject: BASEURL forKey:NSHTTPCookieDomain];
        [cookieProperties setObject:BASEURL forKey:NSHTTPCookieOriginURL];
        [cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
        [cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];
        
        //设置sessionOnly
        [cookieProperties setObject:@"0" forKey:NSHTTPCookieDiscard];
        NSHTTPCookie *addCook = [NSHTTPCookie cookieWithProperties:cookieProperties];
// 利用NSHTTPCookieStorage 全局单利将当前cookie 设置进cookie对应的列表中。 
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:addCook];
    }
}

以上代码,可以为app全局设置指定键值对的cookie。cookie应该在apple第一次发送请求前全局设置,然后将指定的cookie 会自动带给后台,后台会根据传送给后的值进行一些判断。然后后台可能会在某些请求中将设置一些cookie,并且将cookie设置给前端保存。

cookie本地存储

存在后台传递的部分cookie需要存储到本地的情况,注意千万不要将所有的cookie都存在本地,这样会出现一个莫名其妙的错误。 只存储后台指定的cookie。比如说我在一个app中需要存储当前用户对应的设备认证的cookie,该cookie是后台传递给前台的。 前台就需要将对应的cookie从列表中取出来,然后存储到本地,以便杀死app后再次登录时带上该cookie,这样就需要再次进行设备认证。
具体代码实现如下:

//在登录请求成功后,后台会将需要的cookie传递回来,然后将该cookie取出后存储到本地。
+ (void)saveCookieToUserdefault{
//1、获取当前cookie列表,理论上列表中应该已经有了需要保存的cookie
    NSArray* cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
//2、遍历当前cookie列表 
    for (NSHTTPCookie* cookie in cookies) {
// 3、根据设备认证的cookie name取值
        if ([cookie.name isEqualToString:[@"PORTAL_R_" stringByAppendingString:[PAS_LoginSingnal shareInstance].umAccount]]) {
            NSDictionary* dic = @{cookie.name:cookie.value};
//4、 存储当前cookie name--value对应的字典
            NSData* data = [NSKeyedArchiver archivedDataWithRootObject:dic];
            [[NSUserDefaults standardUserDefaults] setObject:data forKey:[self saveKey]];
        }
    }
}

//下次手势密码登陆或者账号密码登陆前将cookie重新添加进去,这样就可以不需要再进行设备认证。
+ (void)cookieLoginForDevice{
//1、根据之前的存储从偏好设置位置中取出相应的值
    NSData* cookieData = [[NSUserDefaults standardUserDefaults] objectForKey:[self saveKey]];
    if ( cookieData.length == 0) {
        return;
    }
    NSDictionary* cookieDic = (NSDictionary*)[NSKeyedUnarchiver unarchiveObjectWithData:cookieData];
//2、 设置cookie 
    [self setCookieValueWithDic:cookieDic];
}

以上就是cookie的正常设置和存取设置。

开发过程中遇到的问题:

1、启动apple后,发送第一个请求,在第一个请求还没有完成前,第二个请求就发送出去了。

  • 因为在第一个请求发送成功后,后台会 写入一些cookie值,例如说JsessionID等,然后会在下一个请求发送时需要自动带上该cookie(JsessionID),可是在第一个请求还没有回调成功前,第二个请求就已经发送了,这样第二个请求的cookie中肯定就不会带上JsessionID,于是后台会在一个分配一个JsessionID给APP端,于是APP端的cookie中可能就有两个或者以上的JsessionID对应的cookie。于是就可能会出现后台数据请求失败等各种莫名其妙的问题,比如说部分请求获取不到数据,偶尔又可以请求到数据。
  • 解决方法:
    a、错开请求发送的时间,等第一个请求成功回调后在发送。 加锁死等,或者让第二个请求晚点发送,延时2s。

2、在app中设置环境切换后保存:

  • 因为切换后台登陆环境后,请求域名会更改, 因为每一个cookie设置都有对应的域名,然后网络请求是根据域名来自动带上cookie的。所以cookie应该也需要全部重新设置。当然最好在设置之前将之前的cookie全部清理一下。
+ (void)deleteAllCookies{
    NSArray* cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
    for (NSHTTPCookie* cookie in cookies) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
}
+(void) setCookieWithDict{
    NSDictionary* cookiePropertys = @{@"esales_app_flag":@"PSS_ESALES_PFS_SMTS",@"app_flag":@"Y"};
    [self setCookieValueWithDic:cookiePropertys];
}

userAgent设置

未完待续。。。。。

你可能感兴趣的:(cookie设置、userAgent设置)