Managing Cookies with CookieHandler in J2SE Tiger
Starting with J2SE Tiger, you can develop your own cookie manager by using the abstract class CookieHandler from the java.net package. The bad news is that J2SE Tiger doesn't provide a default implementation of this class (see "J2SE 5.0 New Features and Behavioral Changes"). To work around this oversight, you'll be building a basic, but functional, implementation of this class.
CookieHandler defines four methods:
-
public static CookieHandler getDefault(): This method should return the default handler, but in J2SE Tiger it will return null;.
-
public static void setDefault(CookieHandler cookie_handler): This method is sets the default cookie manager.
public abstract Map<String,List<String>> get(URI uri, Map<String,List<String>> requestHeaders) throws IOException: This method extracts the correct cookies for the uri URI from the cookie store (database, table, file, etc.). The requestHeaders argument represents a Map from request header field names to lists of field values representing the current request headers. This Map is populated with the correct cookies and returned.
-
public abstract void put(URI uri, Map> responseHeaders) throws IOException: This method extracts all the cookies corresponding to the uri URI from responseHeaders and saves them on the local machine.
Basically, developing your own cookie manager means writing two classes: one class that extends the CookieHandler class, implementing the get and put methods and one class used to parse the cookies.
In this sample cookie manager, the first class is named MyCookieHandler and it replaces existing cookies, deletes expired cookies, and extracts the correct cookies with which to populate the requestHeaders argument. All these tasks are implemented by the get and put methods of the MyCookieHandler class and use the parser class, which is named Cookie (this class is defined later in this article).
To store the cookies (which are merely instances of the Cookie class) this example uses a java.util.List list. However, you could also just as well use a database, a file, or a spreadsheet. Of course, a java.util.List will help you to keep the code in reasonable dimensions and focused on the tasks.
private List<Cookie> myCookieBriefcase=new LinkedList();
Implementing the CookieHandler.put Method
Before you can store the cookies, you must extract them from the Map object, responseHeaders. To do this, locate all the "Set-Cookie" (or "Set-Cookie2") headers:
//implementing the put method
public void put(URI uri,Map<String,List<String>> responseHeaders)throws
IOException {
//a store list for all "Set-Cookie" headers
List<String> getCookies=responseHeaders.get("Set-Cookie");
Next, store the extracted cookies in the myCookieBriefcase list. To do this, iterate over the getCookies list and compare every cookie with the existing cookies from myCookieBriefcase. When two cookies are identical, replace the old cookie with the new one:
if(getCookies!=null)
{
ListIterator getCookies_iterator=getCookies.listIterator();
while(getCookies_iterator.hasNext())
{
String cookie_item=(String)getCookies_iterator.next();
Cookie cookie=new Cookie(uri,cookie_item);
//checking for duplicate cookies
ListIterator myCookieBriefcase_iterator=myCookieBriefcase.listIterator();
while(myCookieBriefcase_iterator.hasNext())
{
Cookie cookie_from_briefcase=(Cookie)myCookieBriefcase_iterator.next();
if((cookie.getURI().equals(cookie_from_briefcase.getURI()))&&
(cookie.getCookieKey().equals(cookie_from_briefcase.getCookieKey())))
{
myCookieBriefcase.remove(cookie_from_briefcase);
break;
}
}
System.out.println("myCookieBriefcase: " + cookie);
//store the cookie
myCookieBriefcase.add(cookie);
}
}
}
Notice that the getURI method is implemented by the Cookie class, presented later in this article.
New on the Java Boutique:
New Review:
Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling
API boasts simplicity, ease-of-integration, a well-rounded feature
set, and it's free!
New Applet:
Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA
sequences into three useful formats.
Elsewhere on internet.com:
WebDeveloper Java
Lots of Java information on webdeveloper.com
WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.
ScriptSearch Java
Hundreds of free Java code files to download.
jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.
|