4

我发现我进行 REST 调用的服务器将 cookie 传递到我的 iPhone。它还使用 HTTP 基本身份验证。

我有一个应用程序,您可以在其中更改用于身份验证的帐户,但是我发现更改凭据并不重要,因为didReceiveAuthenticationChallenge从未调用过。

我研究了两个潜在的修复方法:

  • 每当更改凭据时手动删除 cookie
  • 环境[request setHTTPShouldHandleCookies:NO]

我想知道我是否正确理解了这一点。我预计这NSURLRequestReloadIgnoringCacheData会处理缓存,但似乎并非如此。

我该如何解决这个问题?

编辑:我刚刚尝试设置shouldHandleCookiesNO,但似乎 cookie 仍然传递到服务器。

4

2 回答 2

7

Rob,你说得对,这似乎确实有问题。在某些情况下会设置 Cookie,以保留旧的身份验证凭据。其他人建议您可能需要像这样清除 cookie,这为我解决了问题:

 - (void)clearCookiesForURL {
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray *cookies = [cookieStorage cookiesForURL:_URL];
    for (NSHTTPCookie *cookie in cookies) {
        NSLog(@"Deleting cookie for domain: %@", [cookie domain]);
        [cookieStorage deleteCookie:cookie];
    }
  }

看看这个问题,了解更多 didReceiveAuthenticationChallenge 只被调用一次 iPhone

于 2012-05-16T08:51:10.607 回答
2

安全斯威夫特:

func clearCookies(forURL URL: NSURL) -> Void {
    let cookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
    let cookies = cookieStorage.cookiesForURL(URL) ?? []
    for cookie in cookies {
        print("Deleting cookie for domain: \(cookie.domain)")
        cookieStorage.deleteCookie(cookie)
    }
}

如果你想收到一个String你总是可以flatMap失败的NSURL初始化程序:

let cookies = NSURL(string: string).flatMap(cookieStorage.cookiesForURL) ?? []
于 2016-03-24T02:12:37.550 回答