2

私がやろうとしていることの説明は次のとおりです。HttpURLConnectionを介してログインフォームをWebサイトに送信したいと思います。そのため、まずログインページにGETリクエストを送信して、ログインページが存在し、まだログインしていないことを確認します。接続と入力ストリームを閉じた後、次のパラメータを作成します。送信。次に、実際にログインするためのPOSTリクエストを作成しています。

コード:

url = new URL("http://www.example.com/login/");
con = (HttpURLConnection) url.openConnection();
in = con.getInputStream();
if(con.getResponseCode()==HttpURLConnection.HTTP_OK){
    loginData = getResponseData(in); // InputStream to String
    in.close();
    if(isBlank(loginData)){
        return StatusCode.CONNECTION_FAILED; // no login page
    }
    if (Login.getLoginStatus(loginData)) {
        return StatusCode.NO_ERROR; // already logged in
    }
}
con.disconnect();

String params = "password="+URLEncoder.encode(login.second,"UTF-8")+
        "&username="+URLEncoder.encode(login.first,"UTF-8");

url = new URL("http://www.example.com/login/login.php");
con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setFixedLengthStreamingMode(params.getBytes().length);
out = con.getOutputStream();
out.write(params.getBytes());
out.close();
in = con.getInputStream(); \\ THIS IS WHERE IT GETS STUCK
if(con.getResponseCode()==HttpURLConnection.HTTP_OK){
    loginData = getResponseData(in);
    in.close();
    if(isBlank(loginData)){
        return StatusCode.CONNECTION_FAILED; // no login page
    }
    if (Login.getLoginStatus(loginData)) {
        return StatusCode.NO_ERROR; // logged in
    }   
    if (loginData.contains("Invalid username and//or password.")) {
        return StatusCode.WRONG_LOGIN_DATA; // wrong login
    }
}
con.disconnect();

バージョン2.3.xでは、応答コード302が返され、InputStreamにデータがありません(con.getInputStream()非常に高速です)。Eclipseデバッグモードですべてのヘッダーを確認できます。

バージョン4.0.3では、応答コード200、InputStream内のすべてのデータ(con.getInputStream()約2分間スタックしている)を返し、デバッグモードでは次のように読み取ることができます。

con.ResponseCode = -1
con.ResponseMessage = null
con.redirectionCount = 1

なぜ違いがあるのか​​、2.3.x以降のすべてのバージョンでどのように機能させることができるのか知っていますか?

4

1 に答える 1

3

4.0.3では、リダイレクトが自動的に処理されます(そのため、302応答コードも表示されません)。

クラスには、リダイレクトが自動的に実行されているかどうかを確認するために使用できるgetInstanceFollowRedirects メソッド(またはgetFollowRedirects静的メソッド)があります。HttpURLConnection対応するセッターの対応物(setInstanceFollowRedirectsまたは静的setFollowRedirects)を使用して、この動作を変更できます。

于 2012-07-27T14:48:51.987 に答える