UIWebView 之间不维护会话
Session is not maintained between UIWebView
在我的应用程序中,我试图通过 UIWebView 登录用户。成功登录后,cookie 会设置在 NSHTTPCookieStorage
中。我的应用程序页面很少在 UIWebView 中打开。
当发送特定网页的请求时,它会根据 cookie 检查用户是否登录。
我检查过 NSHTTPCookieStorage
中存在 cookie,但在服务器上不是有效的 cookie。也就是说,它将用户视为已注销用户。
我加载UIWebView的代码如下:
let url = serverURL + urlString
let urlRequest = NSMutableURLRequest(URL: NSURL(string: url)!)
webPage.loadRequest(urlRequest)
甚至我尝试使用 NSURLSession
并将 cookie 设置为 HTTPHeaderField。下面也是我的代码:
let URLRequest: NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: url)!)
let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookiesForURL(NSURL(string: serverURL)!)
for cookie in cookies!{
URLRequest.setValue(cookie.value, forHTTPHeaderField: cookie.name)
}
let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil)
let task = session.downloadTaskWithRequest(URLRequest)
task.resume()
它在少数情况下工作正常。我找不到 cookie 可能有什么问题。
任何帮助将不胜感激。
提前致谢
以下代码不符合您的意图:
for cookie in cookies!{
URLRequest.setValue(cookie.value, forHTTPHeaderField: cookie.name)
}
当通过 HTTP 发送 cookie 时,它们以 Cookie
header 格式发送:
Cookie: cookie1=value1; cookie2=value2
您正在创建多个 headers named cookie 名称,因此您的请求如下所示:
cookie1: value1
cookie2: value2
创建正确 header 的最简单方法是使用 NSHTTPCookie.requestHeaderFieldsWithCookies(_:[NSHTTPCookie])
。因为你没有添加其他 headers,你可以简单地做:
if let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookiesForURL(NSURL(string: serverURL)!) {
URLRequest.allHTTPHeaderFields = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies)
}
顺便说一句,您为请求和查找 cookie 使用了不同的 URL。它们应该与 cookie 相同,可以限定域中的特定路径。
在我的应用程序中,我试图通过 UIWebView 登录用户。成功登录后,cookie 会设置在 NSHTTPCookieStorage
中。我的应用程序页面很少在 UIWebView 中打开。
当发送特定网页的请求时,它会根据 cookie 检查用户是否登录。
我检查过 NSHTTPCookieStorage
中存在 cookie,但在服务器上不是有效的 cookie。也就是说,它将用户视为已注销用户。
我加载UIWebView的代码如下:
let url = serverURL + urlString
let urlRequest = NSMutableURLRequest(URL: NSURL(string: url)!)
webPage.loadRequest(urlRequest)
甚至我尝试使用 NSURLSession
并将 cookie 设置为 HTTPHeaderField。下面也是我的代码:
let URLRequest: NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: url)!)
let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookiesForURL(NSURL(string: serverURL)!)
for cookie in cookies!{
URLRequest.setValue(cookie.value, forHTTPHeaderField: cookie.name)
}
let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil)
let task = session.downloadTaskWithRequest(URLRequest)
task.resume()
它在少数情况下工作正常。我找不到 cookie 可能有什么问题。
任何帮助将不胜感激。
提前致谢
以下代码不符合您的意图:
for cookie in cookies!{
URLRequest.setValue(cookie.value, forHTTPHeaderField: cookie.name)
}
当通过 HTTP 发送 cookie 时,它们以 Cookie
header 格式发送:
Cookie: cookie1=value1; cookie2=value2
您正在创建多个 headers named cookie 名称,因此您的请求如下所示:
cookie1: value1
cookie2: value2
创建正确 header 的最简单方法是使用 NSHTTPCookie.requestHeaderFieldsWithCookies(_:[NSHTTPCookie])
。因为你没有添加其他 headers,你可以简单地做:
if let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookiesForURL(NSURL(string: serverURL)!) {
URLRequest.allHTTPHeaderFields = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies)
}
顺便说一句,您为请求和查找 cookie 使用了不同的 URL。它们应该与 cookie 相同,可以限定域中的特定路径。