1

Eclipseで単純なJavaプロジェクト(動的Webプロジェクトではない)を作成しました。

いくつかのJSON値を返すWebURLにアクセスできるようにしたいと思います。

HttpClientなどを使用してURLにアクセスできますが、JSONデータにアクセスするために必要なセッションを認証できません。認証されていない場合、URLはログインページにリダイレクトします。

セッションを認証するためのさまざまな方法を試しましたが、どれも機能していないようです。常に、JSONではなくログインページのHTMLデータを取得することになります。

また、JSESSION IDがリクエストヘッダーに渡されることにも気づきましたが、JSESSION IDを作成する方法と、それをGETリクエストに渡す方法がわからないようです。

したがって、基本的に、この問題は2つの方法で解決できます。

  1. セッションを認証してから、URLにアクセスしてJSONを取得します
  2. JSESSION IDを作成し、それをGETリクエストに渡してJSONを取得します

誰もがどちらかを行う方法を知っていますか?

最終的に、JSONから収集したデータを使用してSeleniumテストを実行したいので、これをすべて動的Webプロジェクト(Eclipse)内で実行する必要がありますか、それとも通常のJavaプロジェクト内で実行できますか?


試行1

URL url = new URL(_url);

InputStream ins = url.openConnection().getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
StringBuilder builder = new StringBuilder();

for (String line = null; (line = reader.readLine()) != null;) {
    builder.append(line).append("\n");
}

System.out.println("RESPONSE:\n\n" + builder);

JSONTokener tokener = new JSONTokener(builder.toString());
JSONArray finalResult = new JSONArray(tokener);

System.out.println("JSON:\n\n" + finalResult.toString());

試行1の結果

ログインページのHTMLコードを印刷してしまうと、ページにJSONがないため、次のエラーメッセージが表示されます。

Exception in thread "main" org.json.JSONException: A JSONArray text must start with '[' at character 1

試行2

OracleのHttpAuthenticationページにあるコードも試しました。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;

public class RunHttpSpnego {

    static final String kuser = "username"; // your account name
    static final String kpass = "password"; // your password for the account

    static class MyAuthenticator extends Authenticator {
        public PasswordAuthentication getPasswordAuthentication() {
            // I haven't checked getRequestingScheme() here, since for NTLM
            // and Negotiate, the usrname and password are all the same.
            System.err.println("Feeding username and password for " + getRequestingScheme());
            return (new PasswordAuthentication(kuser, kpass.toCharArray()));
        }
    }

    public static void main(String[] args) throws Exception {
        Authenticator.setDefault(new MyAuthenticator());
        URL url = new URL(args[0]);
        InputStream ins = url.openConnection().getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
        String str;
        while((str = reader.readLine()) != null)
            System.out.println(str);
    }
}
4

1 に答える 1

1

ログインすると、サーバーは応答の Set-Cookie ヘッダーを使用して、セッション ID をブラウザーの Cookie として設定します。

Set-Cookie: name=value
Set-Cookie: name2=value2; Expires=Wed, 09-Jun-2021 10:18:14 GMT

ブラウザは、その後の各リクエストのリクエスト ヘッダーで、この Cookie をサーバーに提供します。

Cookie: name=value; name2=value2

HttpClient は、ブラウザーと同様に、この管理を行うことができます。http://hc.apache.org/httpclient-3.x/cookies.htmlを参照してください 。したがって、最初に HttpClient にログイン ページにサーフィンするように指示すると、Cookie が取得され、後続のリクエストで送信されます。平行。

問題を自分の手に取り、Cookie を手動で設定することもできます。HttpClient 3 では、これは次のようになります。

HttpMethod method = new GetMethod();
method.getParams().setCookiePolicy(CookiePolicy.IGNORE_COOKIES);
method.setRequestHeader("Cookie", "special-cookie=value");

HttpClient 4 で Cookie を設定する方法については、Apache HttpClient 4.0.3 - how do I set cookie with sessionID for POST request を参照してください。

または、少しレベルを下げて完全なヘッダーを追加することもできます。

HttpGet httpget = new HttpGet(url); 
httpget.addHeader("Cookie", "JSESSIONID=...");
于 2013-01-16T20:19:57.040 に答える