當使用Java UrlConnection
的,你應該自己處理的cookie,讀取和設置的Cookie,你可以使用setRequestProperty()
和URLConnection
getHeaderField()
。
剩餘部分解析自己的餅乾,一個例子是怎麼可以做到如下:
Map<String, String> cookie = new HashMap<>();
public URLConnection doConnctionWithCookies(URL url) {
StringBuilder builder = new StringBuilder();
builder.append("&");
for(Map.Entry<String,String> entry : cookie.entrySet()) {
builder.append(urlenEncode(entry.getKey()))
.append("=")
.append(urlenEncode(entry.getValue()))
.append("&");
}
builder.setLength(builder.length() - 1);
URLConnection con = url.openConnection();
con.setRequestProperty("Cookie", builder.toString());
con.connect();
// Parse cookie headers
List<String> setCookie = con.getHeaderFields().get("set-cookie");
// HTTP Spec state header fields MUST be case INsentive, I expet the above to work with all servers
if(setCookie == null)
return con;
// Parse all the cookies
for (String str : setCookie) {
String[] cookieKeyValue = str.split(";")[0].split("=",2);
if (cookieKeyValue.length != 2) {
continue;
}
cookie.put(urlenDecode(cookieKeyValue[0]), urlenDecode(cookieKeyValue[1]));
}
return con;
}
public String urlenEncode(String en) {
return URLEncoder.encode(en, "UTF-8");
}
public String urlenDecode(String en) {
return URLDecoder.decode(en, "UTF-8");
}
以上實現是實現餅乾的一個非常愚蠢的和粗暴的方式,而它的工作原理,它完全忽略了cookies也可以具有主機參數以防止在多個主機之間共享標識Cookie的事實。
比自己做的更好的方法是使用專用於Apache HttpClient等任務的庫。
問題是如何處理cookie。請看看[線程](http://stackoverflow.com/questions/6354294/urlconnection-with-cookies) – Scar