Java 的 Cookie 处理类详解编程语言

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.com"; 
    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(); 
  } 
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/11041.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论