NSURLConnection,Basic Auth和Cookies的问题

时间:2011-09-20 21:23:14

标签: iphone objective-c cocoa-touch nsurlconnection http-caching

我发现我调用REST的服务器将cookie传递给我的iPhone。它还使用HTTP Basic Auth。

我有一个应用程序,您可以在其中更改用于身份验证的帐户,但我发现更改凭据无关紧要,因为永远不会调用didReceiveAuthenticationChallenge

我已经研究了两个可能的修复方法:

  • 在更改凭据时手动删除Cookie
  • 设置[request setHTTPShouldHandleCookies:NO]

我想知道我是否正确理解这一点。我希望NSURLRequestReloadIgnoringCacheData能够处理缓存,但似乎并非如此。

我该如何解决这个问题?

编辑:我刚刚尝试将shouldHandleCookies设置为NO,但似乎Cookie仍会传递给服务器。

2 个答案:

答案 0 :(得分:7)

罗布,你说得对,这似乎确实存在问题。在某些情况下会设置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 getting called only once iPhone

答案 1 :(得分: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) ?? []