Cookies

本文档介绍了如何使用 cookie。

概述

JxBrowser 将带有 cookie 的工作委托给 Chromium 引擎。Chromium 决定如何从网络服务器下载cookie,从 HTTP 标头中提取它们并将它们存储在用户数据目录(持久 cookie )或内存(会话cookie)中。

CookieStore 类允许您获得,修改和删除 cookie。 Cookie 类提供有关特定 cookie 的信息。

要获取特定 ProfileCookieStore,请使用 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 存储中。

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,请使用 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,请使用以下代码:

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,请使用以下代码:

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,请使用 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()

您可以使用 NetworkCanSetCookieCallbackCanGetCookiesCallback 回调来控制所有传入和传出的 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(高级加密标准)加密。

Go Top