URLSession是否持久化Cookie?重启App后重复请求是否自动携带Cookie?
嘿,这个问题问到点子上了,我来给你拆解清楚:
1. URLSession是否会持久化Cookie?
答案是默认情况下会,但得看你用的是哪种URLSession配置:
- 如果你用的是
URLSession.shared(也就是你代码里的共享会话),它默认会使用系统的共享HTTP cookie存储,这个存储是持久化的——Cookie会被保存到设备上,就算App重启也不会丢。 - 如果你自己创建自定义
URLSessionConfiguration:.default配置和共享会话行为一致,同样使用持久化的cookie存储;.ephemeral(临时会话)则不会持久化任何Cookie,会话结束后Cookie就会被销毁;.background配置也会持久化Cookie,存储逻辑和前台会话略有不同,但核心是重启后依然能保留。
2. 下次打开App发起相同请求时,会自动带上之前的Cookie吗?
在默认配置(比如URLSession.shared或者.default配置的会话)下,是的,会自动带上。系统的共享cookie存储会自动匹配请求的域名、路径等规则,把符合条件的Cookie自动附加到请求头里,完全不需要你手动处理。
不过要注意几个例外情况:
- 如果Cookie的
Expires或者Max-Age属性设置的过期时间已过,这个Cookie会被自动清理,不会再被带上; - 如果服务器返回的Cookie设置了
HttpOnly、Secure或者特定的Domain/Path规则,只有当请求完全符合这些规则时,Cookie才会被自动附加; - 要是用的是
.ephemeral会话,重启App后之前的Cookie早就没了,自然不会带上。
代码示例说明
你给出的这段代码:
let task = URLSession.shared.dataTask(with: url, completionHandler: { data, response, error in // 处理响应、数据或错误 }) task.resume()
完全是默认行为——当这个请求收到带Set-Cookie头的响应时,系统会自动把Cookie保存到持久化存储里。下次你再用URLSession.shared发起同一个域名的符合规则的请求,Cookie就会被自动加到请求头里,不用写任何额外代码。
如果想自定义Cookie的存储行为(比如手动管理Cookie),可以创建自定义配置:
let config = URLSessionConfiguration.default // 访问httpCookieStorage来手动添加、删除Cookie if let cookieStorage = config.httpCookieStorage { // 手动添加一个Cookie示例 let cookie = HTTPCookie(properties: [ .name: "customCookie", .value: "123456", .domain: "example.com", .path: "/", .expires: Date().addingTimeInterval(3600) ]) if let cookie = cookie { cookieStorage.setCookie(cookie) } } let session = URLSession(configuration: config) let task = session.dataTask(with: url) { data, response, error in // 处理逻辑 } task.resume()
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

