【问题标题】:How to clear cookies from NSHTTPCookieStorage more then once?如何多次从 NSHTTPCookieStorage 中清除 cookie?
【发布时间】:2021-04-24 04:39:19
【问题描述】:

我的桌面应用程序连接到托管在 Google App 引擎上的网络应用程序。一旦它进行身份验证,它就会获得一个 authtoken cookie,它会传递给所有未来的请求。一切正常。

但现在我想添加“退出”。我试过这样实现注销:

- (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 服务交互的应用中始终如一地实现“注销”功能?

谢谢, 杰西

【问题讨论】:

    标签: objective-c cocoa google-app-engine


    【解决方案1】:
    +(void)clearAllCookies {
        NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
        for (NSHTTPCookie *each in cookieStorage.cookies) {
            [cookieStorage deleteCookie:each];
        }
    }
    

    我知道这是一个老问题,但这是答案。我们目前正在我们的应用程序中使用它来清除 UIWebView 的所有 cookie(这只能访问您应用程序中的 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)
    

    【讨论】:

    • “显然这只能访问您的应用程序中的 cookie,而不能以任何方式共享跨应用程序” - 这有多明显?你会认为它会被沙盒化,但是文档状态:“NSHTTPCookieStorage 实现了一个管理共享 cookie 存储的单例对象(共享实例)。这些 cookie 在所有应用程序之间共享并保持同步交叉-进程。”
    • 我的错...下面有一条注释说明这不适用于 iOS。我不知道我是怎么错过的!
    • 嗨,伙计们,无论如何只删除“某些”cookie?例如,仅来自“google.com”的 cookie?
    • NSHTTPCookie 具有名称、域等属性...因此您可以执行类似 if ([cookie.domain isEqualToString@"google.com"]) { ... };跨度>
    • 呃...在迭代数组时删除对象真的可以吗?
    【解决方案2】:

    理论:还有其他相关的 cookie 不在您的服务的 URL 下,因为某些请求会导致重定向,这可能会在您的系统上获取或设置 cookie。

    另外:我推荐using tcpdump for debugging。您将能够准确地看到网络上发生了什么,并确切地知道正在发送或接收哪些 cookie。

    【讨论】:

    • 感谢 tcpdump 链接。我会尝试并报告我的发现。
    • 更好的理论是我在做一些愚蠢的事情并且代码没有按照我的想法做:)。但那是为了您的帮助和 tcpdump 建议,它很快就告诉我到底发生了什么。清除 NSHTTPCookieStorage 似乎工作得很好。
    猜你喜欢
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2017-07-15
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多