Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用已不再可用的技术。
请查看Java语言变化以获取Java SE 9及后续版本中更新的语言特性摘要。
请查看JDK发布说明以获取有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息。
CookieManager
类的两个方面可以定制,即CookiePolicy
和CookieStore
。
为了方便起见,CookiePolicy
定义了以下预定义策略来接受cookie:
CookiePolicy.ACCEPT_ORIGINAL_SERVER
仅接受来自原始服务器的 cookie。CookiePolicy.ACCEPT_ALL
接受所有的 cookie。CookiePolicy.ACCEPT_NONE
不接受任何 cookie。shouldAccept
CookiePolicy
CookiePolicy
CookieManager
setCookiePolicy(cookiePolicy)
下面是一个拒绝来自黑名单域的cookie,并应用CookiePolicy.ACCEPT_ORIGINAL_SERVER
策略的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
BlacklistCookiePolicy
CookieManager
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
CookieManager
CookieStore
CookieStore
您可以实现此接口以提供自己的CookieStore
并在创建时将其传递给CookieManager
。在创建CookieManager
实例后,无法设置CookieStore
。但是,您可以通过调用CookieManager.getCookieStore()
来获取对cookie存储的引用。这样做可能很有用,因为它使您能够利用Java SE提供的默认内存中的CookieStore
实现并补充其功能。
例如,您可能希望创建一个持久性cookie存储,以便即使在重新启动Java虚拟机后也可以使用保存的cookie。您的实现可能类似于以下示例:
下面是此cookie存储的不完整示例。此示例向您展示了如何利用Java SE默认的内存中的cookie存储,并展示了如何扩展其功能。
import java.net.*; import java.util.*; public class PersistentCookieStore implements CookieStore, Runnable { CookieStore store; public PersistentCookieStore() { // 获取默认的内存Cookie存储 store = new CookieManager().getCookieStore(); // 待办事项:从持久存储中读取cookie并添加到存储中 // 添加关闭钩子以将内存中的cookie写入 Runtime.getRuntime().addShutdownHook(new Thread(this)); } public void run() { // 待办事项:将存储中的cookie写入持久存储 } 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(); } }