NSURLConnection 即使在重置授权标头后也会返回缓存的响应

Posted

技术标签:

【中文标题】NSURLConnection 即使在重置授权标头后也会返回缓存的响应【英文标题】:NSURLConnection Return Cached Response Even After Resetting Authorization Heder 【发布时间】:2013-07-17 00:58:29 【问题描述】:

这就是用例。

    应用程序运行,授权标头设置为零。您将获得最新数据。

    [_request setValue:nil forHTTPHeaderField:@"Authorization"];

    用户登录,然后所有对服务器的请求都使用这样的授权标头发送。

    [_request setValue:[NSString stringWithFormat:@"TRUEREST username=%@&session_token=%@&apikey=1234567890",@"username",@"session_token"] forHTTPHeaderField:@"授权"];

    现在我注销了,现在每个请求都带有 Authorization Header nil 值。

    [_request setValue:nil forHTTPHeaderField:@"Authorization"];

但我仍然像登录用户一样收到响应?知道有什么问题吗?

使用如下方式向服务器发出请求

[NSURLConnection sendAsynchronousRequest:_request
                                           queue:[NSOperationQueue mainQueue]
                               completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) ];

我尝试通过以下两种方式制作 NSMutableURLRequest。

    _request = [NSMutableURLRequest requestWithURL:url];

    _request = [[NSMutableURLRequest alloc] initWithURL:url
                                                                cachePolicy:NSURLRequestReloadRevalidatingCacheData
                                                            timeoutInterval:60];

【问题讨论】:

【参考方案1】:

您可以在使用请求之前禁用 cookie:

[_request setHTTPShouldHandleCookies:NO];

或者,删除任何 cookie - 或相关 cookie - 形成 NSHTTPCookieStorage 单例。

但是,您可以使用实现委托connection:willSendRequestForAuthenticationChallenge:NSURLConnection 大大改进您的代码,您可以在其中完全自定义身份验证处理。

【讨论】:

谢谢。它已经解决了这个问题。 当然,您可以使用委托方法并实现您想要的任何细节和任何自定义行为 - 只要它符合 HTTP 协议。 [_request setHTTPShouldHandleCookies:NO];为我做了伎俩。谢谢。 干草人,感谢您的帮助。我想我再次需要你的帮助:)。这个问题有点回来了。现在,当我移至 https 时,当我尝试连续拨打 2 个电话时就会发生这种情况。 这是预期行为。建立初始 SSL/TSL 连接需要执行握手协议,这在 CPU 和时间方面有些复杂且成本高昂。因此,TLS 协议允许使用一种安全的方式来缩短此过程:“Resumed TLS Handshake”。这允许连接使用标识会话的“会话 ID”或“会话票证”。 究竟是如何 NSURLConnection 在其方便的方法 中使用这些选项只是模糊地知道——但可以肯定的是它确实使用了它。 AFAIK,自定义它的唯一方法是实现 NSURLConnection 的委托方法。【参考方案2】:

看起来像服务器问题。服务器应该发送响应头告诉 URL 加载系统不要缓存响应。

【讨论】:

客户端可以指定特定的缓存头,服务器可以做出相应的响应。代理人也参与其中。如果不查看数据包跟踪,就不能笼统地说这是服务器问题。

以上是关于NSURLConnection 即使在重置授权标头后也会返回缓存的响应的主要内容,如果未能解决你的问题,请参考以下文章

如何在NSURLConnection中禁用keepalive?

一旦通过身份验证,HTTP 1.1 授权标头就会随每个请求一起发送到域内的每个资源

Laravel - 如果未经授权,重定向到登录,即使是路由未注册

PHP - 标头/配置“允许来源”不起作用

iOS NSURLSession VS NSURLConnection

如何修复 Spring Security Authorization 标头未通过?