cookiemanager/cookiehandler 仅为轻量级 cookie 收发代理,不管理会话生命周期、不校验 domain/path、不过期清理;默认策略导致登录后401,需复用实例、显式设策略、手动处理域路径匹配与过期。

Java 的 CookieManager 和 CookieHandler 不是“状态管理框架”,它们只是 HTTP cookie 的轻量级自动收发代理,不维护会话生命周期、不处理过期逻辑、也不跨请求共享上下文——你得自己补全。
为什么默认 CookieManager 看似工作,但登录后仍 401?
因为 CookieManager 只在 HttpURLConnection 发起请求时被动读写 Set-Cookie / Cookie 头,它不校验 domain/path、不清理过期 cookie、也不感知重定向链中的 cookie 覆盖。常见现象:登录接口返回了 Set-Cookie: JSESSIONID=abc; Path=/api,但后续请求发到 /user/profile(Path 不匹配)就带不上。
- 必须显式设置
CookiePolicy.ACCEPT_ORIGINAL_SERVER或自定义策略,否则默认拒绝第三方 domain 的 cookie -
CookieManager实例必须复用,每次 new 一个就丢掉已有 cookie - 它不解析
Max-Age或Expires,过期 cookie 仍会被发出——得靠你自己定时清理CookieStore
CookieHandler.setDefault() 的作用范围和陷阱
这个静态设置只影响所有未显式配置 CookieHandler 的 HttpURLConnection 实例,对 OkHttpClient、Apache HttpClient 或 Spring RestTemplate 完全无效。
- 一旦调用
CookieHandler.setDefault(new CookieManager()),所有后续的new URL(...).openConnection()都会走它 - 但如果你在某个线程里临时替换了
CookieHandler(比如测试时 mock),记得恢复原值,否则污染全局 - Android 9+ 默认禁用
HttpURLConnection的 cookie 支持,需手动 setDefault,且要 catchSecurityException
如何让 CookieManager 支持 domain 匹配和路径继承?
标准 CookieManager 的 CookiePolicy 对 domain/path 的判断非常宽松,比如 example.com 不会自动匹配 api.example.com;/api/v1 的 cookie 也不会自动带上 /api/v1/user 请求。
立即学习“Java免费学习笔记(深入)”;
- 别依赖默认策略,改用
CookiePolicy.ACCEPT_ALL(仅限调试)或继承CookiePolicy自定义shouldAccept - 从
CookieStore里取 cookie 时,要手动比对getURI().getHost()和getDomain(),再按 RFC 6265 规则做子域匹配 - 路径匹配不能只看
startsWith,要按 `/a/b` 匹配 `/a/b/c`,但不匹配 `/ab`——得用uri.getPath().startsWith(cookie.getPath())
真正难的不是存 cookie,而是判断该不该发、发哪几个、什么时候删。标准库只提供容器,不提供语义。你得在 CookieStore 上层加一层路由感知逻辑,否则在微服务网关或泛域名部署下,cookie 就是随机失效的。










