簡體   English   中英

如何使用Java在Http Get方法中設置Cookies

[英]How to set Cookies at Http Get method using Java

我想用cookies手動GET以下載和解析網頁。 我需要提取安全令牌,以便在論壇上發帖。 我已完成登錄,已閱讀響應並提取了cookie(3對(名稱,值))。 然后我寫了包含這樣的cookie的String:

CookieString="name1=value1; name2=value2; name3=value3"

然后我做以下事情

HttpURLConnection connection
connection = (HttpURLConnection)(new URL(Link).openConnection());
connection.setRequestMethod("GET");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Cookie", CookieString );
connection.connect();

然后我閱讀了該頁面,但它顯示我沒有登錄論壇。 我究竟做錯了什么?

編輯:我知道如果我想發帖,我必須提取安全令牌。 我的思路是,為了提取它,我需要獲取這個特定的頁面。 但是為了將安全令牌作為隱藏字段,我必須在線,因此我需要cookie。 但是,當我獲取頁面並設置上面提到的cookie時,我將該頁面作為訪客,它表明我不在線,安全令牌的值是guest,這對我沒用。 我會檢查你給我的鏈接,希望能找到解決方案。

當然,您應該從響應的Set-Cookie標頭中收集cookie。 要在后續請求中將它們發回,您應該使用URLConnection#addRequestProperty()逐個設置它們。

基本上:

// ...

// Grab Set-Cookie headers:
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");

// ...

// Send them back in subsequent requests:
for (String cookie : cookies) {
    connection.addRequestProperty("Cookie", cookie.split(";", 2)[0]);
}

// ...

split(";", 2)是為了擺脫與服務器端無關的cookie屬性,如expirespath等。

為了更方便的HTTP客戶端,我建議看一下Apache HttpComponents Client 它可以更透明地處理所有cookie的內容。

也可以看看:


更新 :根據評論,這不是cookie問題。 錯誤的請求令牌意味着服務器內置了CSRF / bot預防(以防止像您這樣的人)。 您需要使用表單從請求的頁面中提取令牌作為隱藏的輸入字段,並將其重新發送為請求參數。 Jsoup可能對提取所有(隱藏)輸入字段很有用。 不要忘記傳遞按鈕的名稱 - 值對,您要以編程方式“按”。 另請參閱上述鏈接以獲取更多提示。

在將來,你應該更清楚你檢索到的確切錯誤,而不是在野外猜測。 Copypaste確切的錯誤消息等。

假設cookie值不是硬編碼的,而是從先前的請求獲得的,那么使用CookieHandler類可能最容易。

CookieHandler.setDefault(new CookieManager());

然后,您的HttpURLConnection將自動保存它收到的任何cookie,並將下一個請求發送回同一主機。

// Grab Set-Cookie headers:
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");

// ...

// Send them back in subsequent requests:
for (String cookie : cookies) {
    connection.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
}

上面的代碼可以用於發送多個cookie,只需使用setRequestProperty而不是addRequestProperty。 工作代碼是:

// Grab Set-Cookie headers:
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");

// ...

// Send them back in subsequent requests:
for (String cookie : cookies) {
    connection.setRequestProperty("Cookie", cookie.split(";", 1)[0]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM