美文网首页
iOS应用退出时的Cookies

iOS应用退出时的Cookies

作者: 雨_树 | 来源:发表于2017-08-04 15:26 被阅读899次

今天碰到一个Case是说App在重启后需要重新登录,研究了一下,发现是因为保存tokencookie在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'标志改变这个行为

在移除cookieNSHTTPCookieDiscard属性,并设置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标志,这种情况下失效时间是无法设置成功的。

至于cookieexpireDate,是在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

相关文章

网友评论

      本文标题:iOS应用退出时的Cookies

      本文链接:https://www.haomeiwen.com/subject/lgevlxtx.html