2009-09-21 38 views
8

我試圖向需要cookie的網頁發出請求。我使用HttpURLConnection類,但反應總是回來說Cookie與Java URLConnection關閉

<div class="body"><p>Your browser's cookie functionality is turned off. Please turn it on. 

我怎樣才能使請求使得查詢服務器認爲我有餅乾打開。我的代碼是這樣的。

private String readPage(String page) throws MalformedURLException { 
    try { 
     URL url = new URL(page); 
     HttpURLConnection uc = (HttpURLConnection) url.openConnection(); 
     uc.connect(); 

     InputStream in = uc.getInputStream(); 
     int v; 
     while((v = in.read()) != -1){ 
      sb.append((char)v); 
     } 
     in.close(); 
     uc.disconnect(); 
    } catch (IOException e){ 
     e.printStackTrace(); 
    } 
    return sb.toString(); 
} 

回答

10

你需要一個的CookieHandler添加爲它處理的cookie的系統。在Java 6之前,JRE中沒有CookieHandler的實現,你必須自己寫。如果你是在Java 6中,你可以做到這一點,

CookieHandler.setDefault(new CookieManager()); 

,URLConnection的cookie處理是真的很弱。它幾乎沒有工作。它不能正確處理所有的cookie規則。如果您正在處理敏感的cookie(如身份驗證),則應該使用Apache HttpClient。

+0

現在我需要弄清楚如何執行http代理身份驗證。我曾與URLConnection合作,但現在我需要在這裏弄清楚。 tsok,谷歌將prolly找到我的東西;)謝謝! – dharga 2009-09-22 13:01:52

1
uc.getHeaderFields() 
// get cookie (set-cookie) here 

URLConnection conn = url.openConnection(); 
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2"); 
conn.addRequestProperty("Referer", "http://xxxx"); 
conn.addRequestProperty("Cookie", "..."); 
-4

如果你想登錄後颳去大量數據,你甚至可以與腳本網站刮板像WebHarvest(http://web-harvest.sourceforge.net/),我用它巨大的成功在我自己的一些項目的更好。

2

我認爲服務器無法確定客戶端不支持cookie的第一個請求。所以,可能服務器發送重定向。嘗試禁用重定向:

uc.setInstanceFollowRedirects(false); 

然後你就可以從響應得到餅乾和下一個請求使用它們(如果需要)。