Cookies
本文档介绍了如何使用 cookie。
概述
JxBrowser 将带有 cookie 的工作委托给 Chromium 引擎。Chromium 决定如何从网络服务器下载cookie,从 HTTP 标头中提取它们并将它们存储在用户数据目录(持久 cookie )或内存(会话cookie)中。
CookieStore
类允许您获得,修改和删除 cookie。 Cookie
类提供有关特定 cookie 的信息。
要获取特定 Profile
的 CookieStore
,请使用 Profile.cookieStore()
方法。 Engine.cookieStore()
方法返回与默认配置文件关联的 CookieStore
。
要访问 cookie 存储,请使用以下方式:
CookieStore cookieStore = profile.cookieStore();
val cookieStore = profile.cookieStore()
支持的协议
JxBrowser 支持使用以下协议发送的 cookie:
- HTTP
- HTTPS
- WS (WebSocket)
- WSS (Secured WebSocket)
如果使用不在列表中的协议发送 cookie,例如 ftp://
,它不会被存储在 cookie 存储中。
使用 Cookie
JxBrowser 支持以下几种 cookie:
- 持久 cookie — 存储在 Chromium 用户数据目录中。 如果删除 Chromium 用户数据目录,所有持久 cookie 都将被删除。
- 会话 cookie — 存储在应用程序内存中。 当应用程序终止时,这些 cookie 将自动删除。
- 安全 cookie — 只能通过加密连接传输,即 HTTPS。 这使得 cookie 不太可能通过窃听暴露于 cookie 盗窃。
- HttpOnly cookie — 不能被客户端 API 访问,例如 JavaScript。 此限制消除了通过跨站点脚本 (XSS) 窃取 cookie 的威胁。 但是,cookie 仍然容易受到跨站点跟踪 (XST) 和跨站点请求伪造 (XSRF) 攻击。
当您修改 cookie 时,请使用 CookieStore.persist()
方法来保存更改。
获取 Cookie
要获取所有 cookie,请使用 cookies()
方法:
cookieStore.cookies().forEach(cookie ->
System.out.println("cookie = " + cookie));
cookieStore.cookies().forEach { println("cookie = $it") }
要通过 URL 获取所有 cookie,请使用接受字符串的 сookies()
方法:
cookieStore.cookies("https://www.google.com").forEach(cookie ->
System.out.println("cookie = " + cookie));
cookieStore.cookies("https://www.google.com").forEach { println("cookie = $it") }
创建 Cookie
持久 Cookie
要创建具有过期时间的持久 cookie,请使用以下代码:
cookieStore.set(Cookie.newBuilder(".google.com")
.creationTime(creationTime)
.expirationTime(expirationTime)
.name("name")
.value("value")
.path("/")
.build());
cookieStore.persist();
cookieStore.set(Cookie.newBuilder(".google.com")
.creationTime(creationTime)
.expirationTime(expirationTime)
.name("name")
.value("value")
.path("/")
.build())
cookieStore.persist()
会话 Cookie
要创建会话 cookie,请使用以下代码:
cookieStore.set(Cookie.newBuilder(".google.com")
.name("name")
.value("value")
.path("/")
.build());
cookieStore.persist();
cookieStore.set(Cookie.newBuilder(".google.com")
.name("name")
.value("value")
.path("/")
.build())
cookieStore.persist()
删除 Cookie
要删除所有 cookie,请使用 deleteAll()
方法:
int numberOfDeletedCookies = cookieStore.deleteAll();
cookieStore.persist();
val numberOfDeletedCookies = cookieStore.deleteAll()
cookieStore.persist()
若要删除一个cookie,请使用 delete(Cookie)
。下面的代码逐个删除所有cookie,以获取操作的结果:
cookieStore.cookies().forEach(cookieStore::delete);
cookieStore.persist();
cookieStore.cookies().forEach(cookieStore::delete)
cookieStore.persist()
抑制 Cookie
您可以使用 Network
的 CanSetCookieCallback
和 CanGetCookiesCallback
回调来控制所有传入和传出的 cookie。
要抑制传入的 cookie,请使用以下代码:
network.set(CanSetCookieCallback.class, params -> Response.cannot());
network.set(CanSetCookieCallback::class.java, CanSetCookieCallback { Response.cannot() })
要抑制传出的 cookie,请使用以下代码:
network.set(CanGetCookiesCallback.class, params -> Response.cannot());
network.set(CanGetCookiesCallback::class.java, CanGetCookiesCallback { Response.cannot() })
加密
JxBrowser 默认支持 cookie 加密。 它使用 Chromium cookie 加密例程,因此 cookie 的存储方式与 Chromium 中的完全相同。
Linux
在 Linux 上,JxBrowser 使用 GNOME 钥匙圈或 KWallet 来加密 cookie。 库会自动选择要使用的商店。 您可以在构建 Engine
时通过适当的选项手动指定要使用的商店。 例如:
Engine engine = Engine.newInstance(EngineOptions.newBuilder(...)
.passwordStore(PasswordStore.GNOME_KEYRING)
.build());
val engine = Engine.newInstance(EngineOptions.newBuilder(...)
.passwordStore(PasswordStore.GNOME_KEYRING)
.build())
Windows
在 Windows 上,JxBrowser 仅使用 DPAPI 来加密 cookie。 目前没有其他选择。
macOS
在 macOS 上,JxBrowser 使用与钥匙串应用程序存储的私钥对 cookie 进行 AES(高级加密标准)加密。