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();
}
}