【问题标题】:Issue with NSURLConnection, Basic Auth and CookiesNSURLConnection、Basic Auth 和 Cookie 的问题
【发布时间】:2016-03-24 22:29:16
【问题描述】:

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

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

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

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

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

我该如何解决这个问题?

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

【问题讨论】:

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


    【解决方案1】:

    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 getting called only once iPhone

    【讨论】:

      【解决方案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) ?? []
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-10
        • 1970-01-01
        • 2012-10-18
        相关资源
        最近更新 更多