Java Tutorial/Network/Cookie

Материал из Java эксперт
Перейти к: навигация, поиск

CookieStore

   <source lang="java">

import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; import java.net.CookieStore; import java.net.HttpCookie; import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set;

public class WebClient {

 public static void main(String[] args) throws Exception {
   CookieStore store = new MyCookieStore();
   CookiePolicy policy = new MyCookiePolicy();
   CookieManager handler = new CookieManager(store, policy);
   CookieHandler.setDefault(handler);
   URL url = new URL("http://localhost:8080/cookieTest.jsp");
   URLConnection conn = url.openConnection();
   InputStream in = conn.getInputStream();
   BufferedReader reader = new BufferedReader(new InputStreamReader(in));
   String input;
   while ((input = reader.readLine()) != null) {
     System.out.println(input);
   }
   reader.close();
 }

} class MyCookiePolicy implements CookiePolicy {

 public boolean shouldAccept(URI uri, HttpCookie cookie) {

// String host = uri.getHost();

 //  return host.equals("localhost");
   return true;
 }

} class MyCookieStore implements CookieStore {

 private Map<URI, List<HttpCookie>> map = new HashMap<URI, List<HttpCookie>>();
 public void add(URI uri, HttpCookie cookie) {
   List<HttpCookie> cookies = map.get(uri);
   if (cookies == null) {
     cookies = new ArrayList<HttpCookie>();
     map.put(uri, cookies);
   }
   cookies.add(cookie);
 }
 public List<HttpCookie> get(URI uri) {
   List<HttpCookie> cookies = map.get(uri);
   if (cookies == null) {
     cookies = new ArrayList<HttpCookie>();
     map.put(uri, cookies);
   }
   return cookies;
 }
 public List<HttpCookie> getCookies() {
   Collection<List<HttpCookie>> values = map.values();
   List<HttpCookie> result = new ArrayList<HttpCookie>();
   for (List<HttpCookie> value : values) {
     result.addAll(value);
   }
   return result;
 }
 public List<URI> getURIs() {
   Set<URI> keys = map.keySet();
   return new ArrayList<URI>(keys);
 }
 public boolean remove(URI uri, HttpCookie cookie) {
   List<HttpCookie> cookies = map.get(uri);
   if (cookies == null) {
     return false;
   }
   return cookies.remove(cookie);
 }
 public boolean removeAll() {
   map.clear();
   return true;
 }

}

The cookieTest.jsp page

<%

   Cookie cookie = new Cookie ("username", "guest");
   cookie.setMaxAge (100);
   response.addCookie (cookie);

%> <html> <head> <title>HttpCookie Demo</title> </head> <body> Add cookie. Cookie name = <%=cookie.getName () +". Cookie value = " + cookie.getValue () %> </body> </html>

//Reference: //Java 6 New Features: A Tutorial //by Budi Kurniawan //Brainy Software Corp. 2006 //Chapter 4 - Networking //# ISBN-10: 0975212885 //# ISBN-13: 978-0975212882</source>





Fetch Cookie with CookieHandler, CookieManager and CookieStore

   <source lang="java">

import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookieStore; import java.net.HttpCookie; import java.net.URL; import java.net.URLConnection; import java.util.List; public class FetchCookie {

 public static void main(String args[]) throws Exception {
   String urlString = "http://java.sun.ru";
   CookieManager manager = new CookieManager();
   CookieHandler.setDefault(manager);
   URL url = new URL(urlString);
   URLConnection connection = url.openConnection();
   Object obj = connection.getContent();
   url = new URL(urlString);
   connection = url.openConnection();
   obj = connection.getContent();
   CookieStore cookieJar = manager.getCookieStore();
   List<HttpCookie> cookies = cookieJar.getCookies();
   for (HttpCookie cookie : cookies) {
     System.out.println(cookie);
   }
 }

}</source>





Using CookieHandler in Java 5

   <source lang="java">
  1. Code referenced from
  2. Chapter 6 - Extensible Markup Language (XML)
  3. Java 6 Platform Revealed
  4. by John Zukowski
  5. ISBN: 1590596609
  6. http://www.apress.ru/book/bookDisplay.html?bID=10109

import java.io.IOException; import java.net.CookieHandler; import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; public class Fetch5 {

 public static void main(String args[]) throws Exception {
   String urlString = "java.sun.ru";
   CookieHandler.setDefault(new ListCookieHandler());
   URL url = new URL(urlString);
   URLConnection connection = url.openConnection();
   Object obj = connection.getContent();
   url = new URL(urlString);
   connection = url.openConnection();
   obj = connection.getContent();
 }

} class ListCookieHandler extends CookieHandler {

 private List<Cookie> cookieJar = new LinkedList<Cookie>();
 public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException {
   List<String> setCookieList = responseHeaders.get("Set-Cookie");
   if (setCookieList != null) {
     for (String item : setCookieList) {
       Cookie cookie = new Cookie(uri, item);
       for (Cookie existingCookie : cookieJar) {
         if ((cookie.getURI().equals(existingCookie.getURI()))
             && (cookie.getName().equals(existingCookie.getName()))) {
           cookieJar.remove(existingCookie);
           break;
         }
       }
       cookieJar.add(cookie);
     }
   }
 }
 public Map<String, List<String>> get(URI uri, Map<String, List<String>> requestHeaders)
     throws IOException {
   StringBuilder cookies = new StringBuilder();
   for (Cookie cookie : cookieJar) {
     // Remove cookies that have expired
     if (cookie.hasExpired()) {
       cookieJar.remove(cookie);
     } else if (cookie.matches(uri)) {
       if (cookies.length() > 0) {
         cookies.append(", ");
       }
       cookies.append(cookie.toString());
     }
   }
   Map<String, List<String>> cookieMap = new HashMap<String, List<String>>(requestHeaders);
   if (cookies.length() > 0) {
     List<String> list = Collections.singletonList(cookies.toString());
     cookieMap.put("Cookie", list);
   }
   System.out.println("CookieMap: " + cookieMap);
   return Collections.unmodifiableMap(cookieMap);
 }

} class Cookie {

 String name;
 String value;
 URI uri;
 String domain;
 Date expires;
 String path;
 private static DateFormat expiresFormat1 = new SimpleDateFormat("E, dd MMM yyyy k:m:s "GMT"",
     Locale.US);
 private static DateFormat expiresFormat2 = new SimpleDateFormat("E, dd-MMM-yyyy k:m:s "GMT"",
     Locale.US);
 public Cookie(URI uri, String header) {
   String attributes[] = header.split(";");
   String nameValue = attributes[0].trim();
   this.uri = uri;
   this.name = nameValue.substring(0, nameValue.indexOf("="));
   this.value = nameValue.substring(nameValue.indexOf("=") + 1);
   this.path = "/";
   this.domain = uri.getHost();
   for (int i = 1; i < attributes.length; i++) {
     nameValue = attributes[i].trim();
     int equals = nameValue.indexOf("=");
     if (equals == -1) {
       continue;
     }
     String name = nameValue.substring(0, equals);
     String value = nameValue.substring(equals + 1);
     if (name.equalsIgnoreCase("domain")) {
       String uriDomain = uri.getHost();
       if (uriDomain.equals(value)) {
         this.domain = value;
       } else {
         if (!value.startsWith(".")) {
           value = "." + value;
         }
         uriDomain = uriDomain.substring(uriDomain.indexOf("."));
         if (!uriDomain.equals(value)) {
           throw new IllegalArgumentException("Trying to set foreign cookie");
         }
         this.domain = value;
       }
     } else if (name.equalsIgnoreCase("path")) {
       this.path = value;
     } else if (name.equalsIgnoreCase("expires")) {
       try {
         this.expires = expiresFormat1.parse(value);
       } catch (ParseException e) {
         try {
           this.expires = expiresFormat2.parse(value);
         } catch (ParseException e2) {
           throw new IllegalArgumentException("Bad date format in header: " + value);
         }
       }
     }
   }
 }
 public boolean hasExpired() {
   if (expires == null) {
     return false;
   }
   Date now = new Date();
   return now.after(expires);
 }
 public String getName() {
   return name;
 }
 public URI getURI() {
   return uri;
 }
 public boolean matches(URI uri) {
   if (hasExpired()) {
     return false;
   }
   String path = uri.getPath();
   if (path == null) {
     path = "/";
   }
   return path.startsWith(this.path);
 }
 public String toString() {
   StringBuilder result = new StringBuilder(name);
   result.append("=");
   result.append(value);
   return result.toString();
 }

}</source>