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 - 如果未经授权,重定向到登录,即使是路由未注册