關(guān)于Cookie 在項(xiàng)目中的應(yīng)用

項(xiàng)目用到了 把用戶信息保存在 cookie 中,類似瀏覽器記錄用戶信息一樣,然后請求的接口從cookie中獲取 當(dāng)前用戶信息,這就要求我們每次登陸后把 cookie 保存起來,還有退出程序 清空cookie的 問題,由于項(xiàng)目中用到了 AFN,所以導(dǎo)致了一些難以發(fā)現(xiàn)的問題。

首先,用戶第一次 注冊APP,請求注冊接口 后臺會把cookie 返回回來,我們需要把cookie保存起來,代碼如下:

NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
NSString *cookieString = [response.allHeaderFields valueForKey:@"Set-Cookie"];
 if (cookieString) {


          NSArray *cookieStrings = [cookieString componentsSeparatedByString:@","];
                for(NSString* temp in cookieStrings)
                {
                    NSArray *tempArr = [temp componentsSeparatedByString:@";"];
                    [finalCookie appendString:[NSString stringWithFormat:@"%@",tempArr[0]]];
                }
             [[XSTUserDefault sharedXSTUserDefault]loadUserInfoFormSanbox];
                [XSTUserDefault sharedXSTUserDefault].cookie = finalCookie;
                [[XSTUserDefault sharedXSTUserDefault]saveUserInfoToSanbox];
              [[NSUserDefaults standardUserDefaults] setObject:cookieString forKey:@"UserCookies"];
              [[NSUserDefaults standardUserDefaults] synchronize];
}
// 單例 項(xiàng)目中共享
                NSHTTPCookieStorage *myCookie = [NSHTTPCookieStorage sharedHTTPCookieStorage];
               NSMutableDictionary *mutdict = [NSMutableDictionary dictionary];
                [mutdict setObject:@"SESSION" forKey:NSHTTPCookieName];
                [mutdict setObject:cookieString forKey:NSHTTPCookieValue];
                [mutdict setObject:@"api.xiaoshentu.com" forKey:NSHTTPCookieDomain];
                [mutdict setObject:@"api.xiaoshentu.com" forKey:NSHTTPCookieOriginURL];
                [mutdict setObject:@"/" forKey:NSHTTPCookiePath];
                [mutdict setObject:@"0" forKey:NSHTTPCookieVersion];
                NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:mutdict];
                [myCookie setCookie:cookie];
                NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject: [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];
                //存儲歸檔后的cookie  由于網(wǎng)頁中用的數(shù)據(jù)是后臺從 cookie取得所以需要保存起來,每次啟動(dòng)APP 在加載下 cookie
                NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
                [userDefaults setObject: cookiesData forKey: @"myCookie"];

每次請求接口需要把 cookie傳給后臺,由于用到的是AFN 當(dāng)cookie 為空時(shí) 需要傳給空字符串給后臺,不然換個(gè)用戶登錄后臺不會返回當(dāng)前用戶cookie,代碼如下

  [[XSTUserDefault sharedXSTUserDefault]loadUserInfoFormSanbox];
    NSString *cookieString = [XSTUserDefault sharedXSTUserDefault].cookie;
    NSLog(@"%@",cookieString);
    if(cookieString){
        [mgr.requestSerializer setValue: cookieString forHTTPHeaderField:@"Cookie"];
    }else{
        [mgr.requestSerializer setValue:@"" forHTTPHeaderField:@"Cookie"];
    }

由于APP 中加載網(wǎng)頁需要用戶信息,后臺是從cookie取得,由于網(wǎng)頁是默認(rèn)加載cookie的 所以每次啟動(dòng)APP 需要加載下當(dāng)前的 保存的cookie,代碼如下:

//合適的時(shí)機(jī)加載持久化后Cookie 一般都是app剛剛啟動(dòng)的時(shí)候
- (void)loadSavedCookies{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    
    //對取出的cookie進(jìn)行反歸檔處理
    NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:[userDefaults objectForKey:@"myCookie"]];
    
    if (cookies) {
        NSLog(@"有cookie");
        //設(shè)置cookie
        NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
        for (id cookie in cookies) {
            [cookieStorage setCookie:(NSHTTPCookie *)cookie];
        }
    }else{
        
        if ([[NSUserDefaults standardUserDefaults]objectForKey:@"UserCookies"]) {
            NSHTTPCookieStorage *myCookie = [NSHTTPCookieStorage sharedHTTPCookieStorage];
            NSMutableDictionary *mutdict = [NSMutableDictionary dictionary];
            [mutdict setObject:@"SESSION" forKey:NSHTTPCookieName];
            [mutdict setObject:[[NSUserDefaults standardUserDefaults]objectForKey:@"UserCookies"] forKey:NSHTTPCookieValue];
// 后面幾個(gè)參數(shù) 一定要設(shè)置,否則發(fā)現(xiàn) cookie 是空的
            [mutdict setObject:@"api.xiaoshentu.com" forKey:NSHTTPCookieDomain];
            [mutdict setObject:@"api.xiaoshentu.com" forKey:NSHTTPCookieOriginURL];
            [mutdict setObject:@"/" forKey:NSHTTPCookiePath];
            [mutdict setObject:@"0" forKey:NSHTTPCookieVersion];
            
            NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:mutdict];
            [myCookie setCookie:cookie];

        }
        
        
        
        NSLog(@"無cookie");
    }
    
    //打印cookie,檢測是否成功設(shè)置了cookie
    NSArray *cookiesA = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies];
    for (NSHTTPCookie *cookie in cookiesA) {
        NSLog(@"setCookie: %@", cookie);
    }
}

加載網(wǎng)頁請求是需要開啟加載cookie,這樣網(wǎng)頁就能獲取用戶信息了。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.url]];
    
    [request setHTTPShouldHandleCookies:YES];

    [self.h5WebView loadRequest:request];

有問題 請加微信 743278081

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,007評論 25 709
  • HTTP cookie(也稱為web cookie,網(wǎng)絡(luò)cookie,瀏覽器cookie或者簡稱cookie)是網(wǎng)...
    留七七閱讀 18,381評論 2 71
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,793評論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評論 19 139
  • 1 人的身體有高低重輕美丑之分,而思維也有差別,體現(xiàn)在深度和寬度上。而深度是單一知識的研究程度,而寬度便是思考問題...
    五九樓閱讀 1,161評論 0 0

友情鏈接更多精彩內(nèi)容