7

しばらく検索しましたが、明確な答えが見つかりません。Webstie にログインしようとしています。 https://hrlink.healthnet.com/ この Web サイトは、一貫性のないログイン ページにリダイレクトします。リダイレクトされた URL にログイン資格情報を送信する必要があります。

これを Java でコーディングしようとしていますが、応答から URL を取得する方法がわかりません。少し面倒に見えるかもしれませんが、テスト中はこのようにしています。

    HttpGet httpget = new HttpGet("https://hrlink.healthnet.com/");
    HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();

    String redirectURL = "";

    for(org.apache.http.Header header : response.getHeaders("Location")) {
        redirectURL += "Location: " + header.getValue()) + "\r\n";
        }        

    InputStream is;
    is = entity.getContent();

    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    while ((line = reader.readLine()) != null) { 
            sb.append(line + "\n"); 
    } 
    is.close(); 

    String result = sb.toString();

結果の文字列が実際のログイン ページを示しているため、リダイレクトされることはわかっていますが、新しい URL を取得できません。

FireFox では TamperData を使用しています。この Web サイトhttps://hrlink.healthnet.com/に移動すると、302 - Found とログイン ページの場所を含む GET があります。次に、実際のログイン ページへの別の GET

どんな助けでも大歓迎ですありがとう。

4

1 に答える 1

9

w3cのドキュメントをチェックしてください:

10.3.3 302 見つかりました

一時的な URI は、応答の Location フィールドで指定する必要があります。リクエスト メソッドが HEAD でない限り、レスポンスのエンティティには、新しい URI へのハイパーリンクを含む短いハイパーテキスト ノートを含める必要があります。

GET または HEAD 以外のリクエストに応答して 302 ステータス コードを受信した場合、ユーザーが確認できない限り、ユーザー エージェントはリクエストを自動的にリダイレクトしてはなりません。これにより、リクエストが発行された条件が変更される可能性があるためです。

1 つの解決策は、POST メソッドを使用して、クライアント側で自動リダイレクトを解除することです。

HttpPost request1 = new HttpPost("https://hrlink.healthnet.com/");
HttpResponse response1 = httpclient.execute(request1);

// expect a 302 response.
if (response1.getStatusLine().getStatusCode() == 302) {
  String redirectURL = response1.getFirstHeader("Location").getValue();
  
  // no auto-redirecting at client side, need manual send the request.
  HttpGet request2 = new HttpGet(redirectURL);
  HttpResponse response2 = httpclient.execute(request2);

  ... ...
}

お役に立てれば。

于 2012-04-26T22:20:32.567 に答える