我的桌面应用程序连接到托管在Google App引擎上的Web应用程序.一旦它进行身份验证,它就会获得一个authtoken cookie,它会传递给所有未来的请求.这一切都有效.
但现在我想添加"退出".我试图像这样实现Sign Out:
- (void)signOut { NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie *each in [[[cookieStorage cookiesForURL:[NSURL URLWithString:self.serviceRootURLString]] copy] autorelease]) { [cookieStorage deleteCookie:each]; } [self clearCredentialStorage]; }
问题是它似乎只是第一次工作.例如,我可以打开我的应用程序.登录.提出一些要求.登出.然后下次我提出请求时,我会被要求再次进行身份验证.好!
但在我第二次验证问题发生后.身份验证有效.我得到了authtoken cookie.我可以提出要求.但是当我尝试第二次注销(没有重新启动我的应用程序)时,authtoken cookie似乎没有被删除.它似乎从我的应用程序角度删除...我问NSHTTPCookieStorage它有我的URL的cookie,它没有返回.但是如果我尝试发出另一个请求(应该需要authtoken cookie)请求才能正常工作,我没有得到401响应,我再也没有被要求进行身份验证.
因此,如果我正确理解事物,似乎从我的角度删除了cookie,但它们不会从底层URL加载框架的角度删除.
可能感兴趣的可能是问题与:http://www.macworld.com/article/143343/2009/10/safaricookieproblems.html
有谁知道如何在与Web服务交互的应用程序中始终如一地实现"注销"功能?
谢谢,杰西
+(void)clearAllCookies {
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *each in cookieStorage.cookies) {
[cookieStorage deleteCookie:each];
}
}
我知道这是一个老问题,但答案就是这样.我们目前正在使用我们的应用程序清除所有Cookie UIWebView
(这只能访问您应用中的Cookie,而不是以任何方式共享交叉应用).
如果您只想清除特定的一次,您可以随时检查每个cookie对象的属性,决定是否要删除它.例如cookie.name isEqualToString @"somename"
希望这有助于那里的人.
编辑:从某些iOS版本开始,现在有一种更简单的方法,有一种新方法可以按日期清除cookie.
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; [cookieStorage removeCookiesSinceDate:[NSDate dateWithTimeIntervalSince1970:0]];
SWIFT 4.X版本:(更简单,一个班轮)
HTTPCookieStorage.shared.cookies?.forEach(HTTPCookieStorage.shared.deleteCookie)