我正在开发一个应用程序,服务器向我提供cookie以识别用户。
我的连续请求需要让cookie具有用户期望的响应。 我无法理解的是NSHTTPCookieStorage的共享实例如何以及何时丢失其cookie。
我使用的第一个解决方案是将cookie从我的服务器存档并保存到应用程序终端的用户默认值,然后在应用程序启动时从我的服务器清除现有的cookie并重置我存储的那些。 通过开发过程,我没有遇到问题,因为调试会话非常短,通常不需要将应用程序放在后台。
在beta测试期间,麻烦开始了。 我带来的黑客攻击不仅是在应用程序终止时保存cookie,而且还在API调用后将这些cookie保存回来。并且不仅在应用程序启动时加载已保存的cookie,而且还在应用程序返回前台时加载。
NSHTTPCookieStorage共享实例如何摆脱这些cookie以及处理它的最佳做法是什么,因为它是我的应用程序的重要部分,如果没有经验丰富的开发人员支持,我不能相信这样一个被黑客攻击的解决方案。
提前感谢您的回答
编辑: 以下是保存/读取/清除cookie的方法
-(void)saveStoredCookies
{
NSURL *httpUrl = @"http://myServer.com";
NSURL *httpsUrl = @"https://myServer.com";
NSArray *httpCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];
NSData *httpCookiesData = [NSKeyedArchiver archivedDataWithRootObject:httpCookies];
[[NSUserDefaults standardUserDefaults] setObject:httpCookiesData forKey:@"savedHttpCookies"];
NSArray *httpsCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl];
NSData *httpsCookiesData = [NSKeyedArchiver archivedDataWithRootObject:httpsCookies];
[[NSUserDefaults standardUserDefaults] setObject:httpsCookiesData forKey:@"savedHttpsCookies"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
-(void)readStoredCookies
{
//clear, read and install stored cookies
NSURL *httpUrl = @"http://myServer.com";
NSURL *httpsUrl = @"https://myServer.com";
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];
for (NSHTTPCookie *cookie in cookies) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}
cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl];
for (NSHTTPCookie *cookie in cookies) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}
NSData *httpCookiesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"savedHttpCookies"];
if([httpCookiesData length]) {
NSArray *savedCookies = [NSKeyedUnarchiver unarchiveObjectWithData:httpCookiesData];
for (NSHTTPCookie *cookie in savedCookies) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
}
NSData *httpsCookiesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"savedHttpsCookies"];
if([httpsCookiesData length]) {
NSArray *savedCookies = [NSKeyedUnarchiver unarchiveObjectWithData:httpsCookiesData];
for (NSHTTPCookie *cookie in savedCookies) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
}
}
-(void)clearStoredCookies
{
NSURL *httpUrl = @"http://myServer.com";
NSURL *httpsUrl = @"https://myServer.com";
NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];
for (NSHTTPCookie *cookie in cookies) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}
cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpsUrl];
for (NSHTTPCookie *cookie in cookies) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}
}
答案 0 :(得分:18)
NSHttpCookieStorage因为您没有设置Cookie的到期时间而丢失其Cookie。设置过期时间是必要的,否则当您的应用退出时,您的Cookie将会丢失。
以下是我在app退出和启动期间如何存储我的Cookie的快速浏览,
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:name forKey:NSHTTPCookieName];
[cookieProperties setObject:strValue forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"myserver.com" forKey:NSHTTPCookieDomain]; // Without http://
[cookieProperties setObject:@"myserver.com" forKey:NSHTTPCookieOriginURL]; // Without http://
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
// set expiration to one month from now or any future NSDate of your choice
// this makes the cookie sessionless and it will persist across web sessions and app launches
/// if you want the cookie to be destroyed when your app exits, don't set this
[cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
希望这有帮助。
答案 1 :(得分:4)
这是模拟器吗?并使用滚动饼干?
在模拟器中,cookie并没有真正存在,因为它们与桌面Safari共享。随着cookie的翻转,最终会覆盖另一个。
这不是设备本身的问题,每个应用都有自己的cookie商店。 (而且,事实上,我还没有注意到它在Mountain Lion中发生过。)
答案 2 :(得分:1)
humayun可能是对的 -
但是,您不应该将cookie写入NSUserDefaults -
sharedHTTPCookieStorage的重点是从那里读取它们。
NSArray *httpCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:httpUrl];
出于安全原因,您甚至无法将这些cookie写入NSUserDefaults。 但也许你可以。无论哪种方式,很可能超时没有设置为humayun提到的。
无论哪种方式,请重构您的代码,不要尝试将cookie存储在用户首选项中。
答案 3 :(得分:0)
解决了!
经过一些简单的调试后,我发现问题出在我在cookiesForURL:
中使用的网址上。
我只是开始使用cookies
属性,现在它可以正常工作。