Two aspects of the CookieManager class can be customized, the
CookiePolicy and the CookieStore.
For convenience,CookiePolicydefines the following pre-defined policies for accepting cookies:
CookiePolicy.ACCEPT_ORIGINAL_SERVERonly accepts cookies from the original server.CookiePolicy.ACCEPT_ALLaccepts all cookies.- You can also define your own cookie policy by implementing the
CookiePolicy.ACCEPT_NONEaccepts no cookies.shouldAcceptmethod ofCookiePolicy. You can then use thisCookiePolicyby passing it to the multi-argumentCookieManagerconstructor or by calling thesetCookiePolicy(cookiePolicy)method to change an already existing cookie manager.The following is an example of a cookie policy that rejects cookies from domains that are on a blacklist, before applying the
CookiePolicy.ACCEPT_ORIGINAL_SERVERpolicy: 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); } } When you create aBlacklistCookiePolicyinstance, you pass it an array of strings representing the domains that you do not want to accept cookies from. Then, you set thisBlacklistCookiePolicyinstance as the cookie policy for yourCookieManager. For example: String[] list = new String[] { ".bar.com" }; CookieManager cm = new CookieManager(null, new BlacklistCookiePolicy(list)); CookieHandler.setDefault(cm); The sample code will not accept cookies from hosts such as the following: foo.bar.com goo.bar.com However, this sample code will accept cookies from hosts such as the following: y.com bar.com x.foo.bar.com
ACookieStoreis an interface that represents a storage area for cookies.CookieManageradds the cookies to theCookieStorefor every HTTP response and retrieves cookies from theCookieStorefor every HTTP request.You can implement this interface to provide your own
CookieStoreand pass it to theCookieManagerduring creation. You cannot set theCookieStoreafter theCookieManagerinstance has been created. However, you can get a reference to the cookie store by callingCookieManager.getCookieStore(). Doing so can be useful as it enables you to leverage the default in-memoryCookieStoreimplementation that is provided by Java SE and complement its functionality.For example, you might want to create a persistent cookie store that would save cookies so that they can be used even if the Java Virtual Machine is restarted. Your implementation would work similar to the following:
The following is an incomplete example of this cookie store. This example shows you how to leverage the Java SE default in-memory cookie store and how you might extend its functionality. 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(); } }
- Any cookies that were previously saved are read in.
- During runtime, cookies are stored and retrieved from memory.
- Cookies are written out to persistent storage before exiting.