Write/Read cookies using HTTPTag(s): Networking


For a Java-Javascript solution, check this How-to.
import java.net.*;
import java.io.*;
import java.util.*;

class CookiesInJava {
 static Hashtable theCookies = new Hashtable();
 /**
  * Send the Hashtable (theCookies) as cookies, and write them to
  *  the specified URLconnection
  *
  * @param   urlConn  The connection to write the cookies to.
  * @param   printCookies  Print or not the action taken.
  *
  * @return  The urlConn with the all the cookies in it.
 */
 public URLConnection writeCookies
     (URLConnection urlConn, boolean printCookies){
   String cookieString = "";
   Enumeration keys = theCookies.keys();
   while (keys.hasMoreElements()) {
     String key = (String)keys.nextElement();
     cookieString += key + "=" + theCookies.get(key);
     if (keys.hasMoreElements())
        cookieString += "; ";
     }
   urlConn.setRequestProperty("Cookie", cookieString);
   if (printCookies)
      System.out.println("Wrote cookies:\n   " + cookieString);
   return urlConn;
   }

 /**
  * Read cookies from a specified URLConnection, and insert them
  *   to the Hashtable
  *  The hashtable represents the Cookies.
  *
  * @param   urlConn  the connection to read from
  * @param   printCookies  Print the cookies or not, for debugging
  * @param   reset  Clean the Hashtable or not
 */
 public void readCookies(URLConnection urlConn, boolean printCookies,
                     boolean reset){
   if (reset)
      theCookies.clear();
   int i=1;
   String hdrKey;
   String hdrString;
   String aCookie;
   while ((hdrKey = urlConn.getHeaderFieldKey(i)) != null) {
     if (hdrKey.equals("Set-Cookie")) {
        hdrString = urlConn.getHeaderField(i);
        StringTokenizer st = new StringTokenizer(hdrString,",");
        while (st.hasMoreTokens()) {
          String s = st.nextToken();
          aCookie = s.substring(0, s.indexOf(";"));
          // aCookie = hdrString.substring(0, s.indexOf(";"));
          int j = aCookie.indexOf("=");
          if (j != -1) {
             if (!theCookies.containsKey(aCookie.substring(0, j))){
               // if the Cookie do not already exist then when keep it,
               // you may want to add some logic to update 
               // the stored Cookie instead. thanks to rwhelan
               theCookies.put
                   (aCookie.substring(0, j),aCookie.substring(j + 1));
               if (printCookies){
                  System.out.println("Reading Key: " 
                     + aCookie.substring(0, j));
                  System.out.println("        Val: " 
                     + aCookie.substring(j + 1));
                  }
               }
             }
          }
      }
      i++;
     }
  }

 /**
  * Display all the cookies currently in the HashTable
  *
 */
 public void viewAllCookies() {
   System.out.println("All Cookies are:");
   Enumeration keys = theCookies.keys();
   String key;
   while (keys.hasMoreElements()){
     key = (String)keys.nextElement();
     System.out.println("   " + key + "=" +
     theCookies.get(key));
     }
   }

 /**
  * Display the current cookies in the URLConnection,
  *    searching for the: "Cookie" header
  *
  * This is Valid only after a writeCookies operation.
  *
  * @param   urlConn  The URL to print the associates cookies in.
 */
 public void viewURLCookies(URLConnection urlConn) {
   System.out.print("Cookies in this URLConnection are:\n   ");
   System.out.println(urlConn.getRequestProperty("Cookie"));
   }

 /**
  * Add a specific cookie, by hand, to the HastTable of the Cookies
  *
  * @param   _key  The Key/Name of the Cookie
  * @param   _val  The Calue of the Cookie
  * @param   printCookies  Print or not the result
 */
 public void addCookie(String _key, String _val, boolean printCookies){
   if (!theCookies.containsKey(_key)){
      theCookies.put(_key,_val);
      if (printCookies){
         System.out.println("Adding Cookie: ");
         System.out.println("   " + _key + " = " + _val);
         }
      }
   }
}
Thanks to Saar Machtiner for the bug fix
blog comments powered by Disqus