UIWebView之间不维护会话

时间:2016-02-16 10:10:10

标签: swift uiwebview nsurlconnection nshttpcookiestorage

在我的应用程序中,我正在尝试通过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的问题。

任何帮助将不胜感激。

提前致谢

1 个答案:

答案 0 :(得分:0)

以下代码不符合您的要求:

for cookie in cookies!{
    URLRequest.setValue(cookie.value, forHTTPHeaderField: cookie.name)
}

当通过HTTP发送cookie时,它们将以格式为Cookie的标头发送:

Cookie: cookie1=value1; cookie2=value2

您正在创建多个标题名为的Cookie名称,因此您的请求如下所示:

cookie1: value1
cookie2: value2

创建正确标头的最简单方法是使用NSHTTPCookie.requestHeaderFieldsWithCookies(_:[NSHTTPCookie])。由于您没有添加其他标题,因此您可以执行以下操作:

if let cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage().cookiesForURL(NSURL(string: serverURL)!) {
    URLRequest.allHTTPHeaderFields = NSHTTPCookie.requestHeaderFieldsWithCookies(cookies)
}

顺便说一句,您使用不同的URL来查找请求和查找Cookie。它们应该与Cookie可以限定为域中的特定路径相同。