web-dev-qa-db-ja.com

Javaを使用してHttp GetメソッドでCookieを設定する方法

Webページをダウンロードして解析するために、Cookieを使用して手動でGETを実行したいと考えています。フォーラムに投稿するには、セキュリティトークンを抽出する必要があります。ログインを完了し、応答を読み、Cookieを抽出しました((name、value)の3ペア)。次に、次のようなCookieを含む文字列を作成しました。

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を設定すると、ページがゲストとして取得されます。これは、オンラインではなく、セキュリティトークンの値がゲストであることを示しています。私はあなたが私に与えたリンクをチェックし、うまくいけば解決策を見つけるでしょう。

16
fysob

確かに、応答の_Set-Cookie_ヘッダーからCookieを収集する必要があります。後続のリクエストでそれらを送り返すには、 URLConnection#addRequestProperty() を使用して1つずつ設定する必要があります。

基本的に:

_// ...

// 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)は、expirespathなどのサーバー側に関係のないcookie属性を取り除くためにあります。

より便利なHTTPクライアントについては、 Apache HttpComponents Client を参照することをお勧めします。すべてのCookieをより透過的に処理できます。

以下も参照してください。


更新:コメントのとおり、これはCookieの問題ではありません。間違った要求トークンは、サーバーにCSRF /ボット防止機能が組み込まれていることを意味します(あなたのような人を防止するため)。フォームを使用して、リクエストされたページからトークンを非表示の入力フィールドとして抽出し、リクエストパラメータとして再送信する必要があります。 Jsoup は、すべての(非表示の)入力フィールドを抽出するのに役立ちます。プログラムで「押し」たいボタンの名前と値のペアも渡すことを忘れないでください。ヒントについては、上記のリンクも参照してください。

将来的には、取得する正確なエラーをより明確にし、実際に何かを推測しないようにする必要があります。正確なエラーメッセージなどをコピーして貼り付けます。

15
BalusC

Cookieの値がハードコードされておらず、前のリクエストから取得されていると想定すると、CookieHandlerクラスを使用するのがおそらく最も簡単です。

CookieHandler.setDefault(new CookieManager());

次に、HttpURLConnectionは受信したCookieを自動的に保存し、同じホストへの次のリクエストでそれらを送り返します。

6
finnw