Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
可以自定义 CookieManager
类的两个方面,CookiePolicy
和 CookieStore
。
为方便起见,CookiePolicy
定义了以下用于接受 cookie 的预定义策略:
CookiePolicy.ACCEPT_ORIGINAL_SERVER
仅接受来自原始服务器的 Cookie。CookiePolicy.ACCEPT_ALL
接受所有 Cookie。CookiePolicy.ACCEPT_NONE
不接受任何 Cookie。CookiePolicy
的 shouldAccept
方法来定义自己的 cookie 策略。然后,你可以使用此 CookiePolicy
将其传递给多参数 CookieManager
构造函数,或者通过调用 setCookiePolicy(cookiePolicy)
方法来更改已经现有的 cookie 管理器。
以下是在应用 CookiePolicy.ACCEPT_ORIGINAL_SERVER
策略之前拒绝来自黑名单中的域的 cookie 的 cookie 策略的示例:
import java.net.*; public class BlacklistCookiePolicy implements CookiePolicy { String[] blacklist; public BlacklistCookiePolicy(String[] list) { blacklist = list; } public boolean shouldAccept(URI uri, HttpCookie cookie) { String host; try { host = InetAddress.getByName(uri.getHost()).getCanonicalHostName(); } catch (UnknownHostException e) { host = uri.getHost(); } for (int i = 0; i<blacklist.length; i++) { if (HttpCookie.domainMatches(blacklist[i], host)) { return false; } } return CookiePolicy.ACCEPT_ORIGINAL_SERVER.shouldAccept(uri, cookie); } }
BlacklistCookiePolicy
实例时,会向其传递一个字符串数组,表示你不希望接受 Cookie 的域。然后,将此 BlacklistCookiePolicy
实例设置为 CookieManager
的 Cookie 策略。例如:
String[] list = new String[]{ ".example.com" }; CookieManager cm = new CookieManager(null, new BlacklistCookiePolicy(list)); CookieHandler.setDefault(cm);
host.example.com domain.example.com
example.com example.org myhost.example.org
CookieStore
是表示 Cookie 存储区域的接口。CookieManager
为每个 HTTP 响应将 Cookie 添加到 CookieStore
,并为每个 HTTP 请求从 CookieStore
获取 Cookie。
你可以实现此接口以提供你自己的 CookieStore
,并在创建期间将其传递给 CookieManager
。在创建 CookieManager
实例后,你无法设置 CookieStore
。但是,你可以通过调用 CookieManager.getCookieStore()
来获取对 cookie 存储的引用。这样做非常有用,因为它使你能够利用 Java SE 提供的默认内存 CookieStore
实现并补充其功能。
例如,你可能希望创建一个可以保存 cookie 的持久性 cookie 存储,以便即使重新启动 Java 虚拟机也可以使用它们。你的实现将类似于以下内容:
以下是此 cookie 存储的不完整示例。此示例显示如何利用 Java SE 默认的内存中 cookie 存储以及如何扩展其功能。
import java.net.*; import java.util.*; public class PersistentCookieStore implements CookieStore, Runnable { CookieStore store; public PersistentCookieStore() { // get the default in memory cookie store store = new CookieManager().getCookieStore(); // todo: read in cookies from persistant storage // and add them store // add a shutdown hook to write out the in memory cookies Runtime.getRuntime().addShutdownHook(new Thread(this)); } public void run() { // todo: write cookies in store to persistent storage } public void add(URI uri, HttpCookie cookie) { store.add(uri, cookie); } public List<HttpCookie> get(URI uri) { return store.get(uri); } public List<HttpCookie> getCookies() { return store.getCookies(); } public List<URI> getURIs() { return store.getURIs(); } public boolean remove(URI uri, HttpCookie cookie) { return store.remove(uri, cookie); } public boolean removeAll() { return store.removeAll(); } }