Java 的 Cookie 處理類

yb25 9年前發布 | 1K 次閱讀 Java

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(); } }</pre>

 本文由用戶 yb25 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!