今天碰到一个Case是说App在重启后需要重新登录,研究了一下,发现是因为保存token
的cookie
在App重启后被自动删除了,以至于App重启后,即使token
还没有失效,用户也得重新登录。
一开始分析如下的token
的时候,就发现有个奇怪点,就是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重启后依然在,但是这个却被删除了,后面发现:
iOS 默认在应用退出时删除Cookie
可以通过移除Cookie的'NSHTTPCookieDiscard'标志改变这个行为
在移除cookie
的NSHTTPCookieDiscard
属性,并设置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]];
}
}
注意这里,我一开始试着直接设置失效时间,而没有移除Discard
标志,这种情况下失效时间是无法设置成功的。
至于cookie
的expireDate
,是在Web Server
中设置的,比如对于Tomcat
,在web.xml
中:
<session-config>
<session-timeout>525600</session-timeout>
<cookie-config>
<max-age>31536000</max-age>
</cookie-config>
</session-config>
引用
iOS Cookies 每次退出应用都被清除解决方法
JSESSIONID Cookie with Expiration Date in Tomcat