2016-01-22 51 views
0

我正嘗試使用以下代碼來獲取重定向的URL,然後對其進行一些處理。但是,當我打印重定向的鏈接時,它會轉到一個頁面,通知Cookie不存在。如何在打開url連接時啓用cookie?如何在打開URL的連接時啓用cookie

String url = "http://dx.doi.org/10.1137/0210059"; 
URLConnection con = new URL(url).openConnection(); 
con.getInputStream(); 
String redirctedURL= con.getURL().toString(); 
System.out.println(redirctedURL); 
+0

問題是如何處理cookie。請看看[線程](http://stackoverflow.com/questions/6354294/urlconnection-with-cookies) – Scar

回答

0

當使用Java UrlConnection的,你應該自己處理的cookie,讀取和設置的Cookie,你可以使用setRequestProperty()URLConnectiongetHeaderField()

剩餘部分解析自己的餅乾,一個例子是怎麼可以做到如下:

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等任務的庫。

相關問題