今天碰到一個Case是說App在重啟后需要重新登錄,研究了一下,發(fā)現(xiàn)是因為保存token的cookie在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'標志改變這個行為
在移除cookie的NSHTTPCookieDiscard屬性,并設(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è)置成功的。
至于cookie的expireDate,是在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