iOS應(yīng)用退出時的Cookies

今天碰到一個Case是說App在重啟后需要重新登錄,研究了一下,發(fā)現(xiàn)是因為保存tokencookie在App重啟后被自動刪除了,以至于App重啟后,即使token還沒有失效,用戶也得重新登錄。

一開始分析如下的token的時候,就發(fā)現(xiàn)有個奇怪點,就是expiresDate為空:

<NSHTTPCookie 
version:0 
name:"JSESSIONID" 
value:"B838F778DBD85030ACD9AFB212B66337" 
expiresDate:(null) 
created:2017-08-03 07:37:29 +0000 
sessionOnly:TRUE 
domain:"******"
partition:"none" 
path:"/******" 
isSecure:TRUE>

另外一個不為空的cookie在App重啟后依然在,但是這個卻被刪除了,后面發(fā)現(xiàn):

iOS 默認在應(yīng)用退出時刪除Cookie
可以通過移除Cookie的'NSHTTPCookieDiscard'標志改變這個行為

在移除cookieNSHTTPCookieDiscard屬性,并設(shè)置NSHTTPCookieExpires后,iOS就不會在App退出時,自動刪除這個cookie

    NSHTTPCookie *cookie;
    NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (cookie in [storage cookies]) {
        if (cookie.expiresDate == nil) {
            NSMutableDictionary *properties = [[cookie properties] mutableCopy];
            
            NSDate *expiresDate = [NSDate dateWithTimeIntervalSinceNow:3600];//1hour
            properties[NSHTTPCookieExpires] = expiresDate;
            
            [properties removeObjectForKey:NSHTTPCookieDiscard];
            
            [storage setCookie:[NSHTTPCookie cookieWithProperties:properties]];
        }
    }

注意這里,我一開始試著直接設(shè)置失效時間,而沒有移除Discard標志,這種情況下失效時間是無法設(shè)置成功的。

至于cookieexpireDate,是在Web Server中設(shè)置的,比如對于Tomcat,在web.xml中:

<session-config>
    <session-timeout>525600</session-timeout> 
    <cookie-config>
        <max-age>31536000</max-age>
    </cookie-config>
</session-config>

引用

iOS Cookies 每次退出應(yīng)用都被清除解決方法
JSESSIONID Cookie with Expiration Date in Tomcat

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

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

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