3

Spring (MVC、セキュリティ、トランザクションなど) で構築された Java アプリ (jetty サーバー) があり、Web サービスに REST を使用しています。Apache HTTPClient (HttpComponents) を使用してサーバーへの REST 呼び出しを行う別の Java クライアントがあります。サーバー アプリはフォーム ベースの認証を使用し、Web クライアントは j_spring_security_check フォームを使用してアプリにログインします。したがって、Java クライアントから [https://host:port/myapp/j_spring_security_check?j_username=myuser&j_password=mypass] を使用し、POST を使用してログインを行います。認証は正常に機能しています (UserDetailService の子クラスに到達し、認証が正常に行われます) が、後続の REST 呼び出しは失敗し、ユーザーが認証されなかったかのように示されます (呼び出しは、指定された残りの呼び出しのコントローラー メソッドに到達しません)。アプリの html ページの 1 つが返されます (これは jsp ページの 1 つです)。

私はすべてのリクエスト(ログインを含む)に対してCookieを出力しており、リクエストごとに異なるjsessionidを出力しています(リクエストはサーバーへの残りの呼び出しです)。リクエストごとに 1 つの Cookie を次に示します。最初のリクエストはログイン リクエストです (リクエストごとに jsessionid が異なることに注意してください)。

cookies: [[version: 0][name: JSESSIONID][value: 1x5i3b0lbf5o7xv52kjh0vu89][domain: 127.0.0.1][path: /webui][expiry: null]]
cookies: [[version: 0][name: JSESSIONID][value: t05vbrffqv6t1xcygps9l6jaz][domain: 127.0.0.1][path: /webui][expiry: null]]
cookies: [[version: 0][name: JSESSIONID][value: 8v5i5ofbgr201kh2txxale674][domain: 127.0.0.1][path: /webui][expiry: null]]

リクエストごとに異なる jsessionid が問題/原因ですか? この問題を回避するにはどうすればよいですか? HttpClient を使用したコードは次のとおりです。

    request = new HttpPost(url);
    httpClient = new DefaultHttpClient();        

    httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", 443, socketFactory));

    HttpResponse response = httpClient.execute(request);
    System.out.println("cookies: " + httpClient.getCookieStore().getCookies());
    HttpEntity resp_ent = response.getEntity();
    this.status_code = response.getStatusLine().getStatusCode();

Cookie を保存するために何か特別なことをする必要がありますか? どんな助けでも大歓迎です。

4

2 に答える 2

1

あなたが示したコードスニペットからは明らかではないので、これが問題かどうかはわかりませんが、new DefaultHttpClient()リクエストごとに を作成しないようにしてください。そうしないと、新しいクライアントに新しいCookieStore.

于 2013-03-08T22:40:08.727 に答える
0

まずは流れを明確にしたい。認証が成功すると、(Java) サーバーは JSESSIONID Cookie を応答に追加します。クライアント (ブラウザーまたは他のクライアント。この場合は Apache HTTP クライアント) は、応答から Cookie を取得し、新しい要求と共に送信します。次に、リクエストが Cookie を使用してサーバーにアクセスすると、リクエストが認証され、認証を必要としないことを確認できます。それ以外の場合 (Cookie を使用しない要求)、サーバーは認証を必要とします。

あなたの場合、クッキーストアなしでApache HTTPクライアントを使用すると、クッキーなしで送信された各リクエストが保存されます。これを修正するには、Cookie ストアを割り当てる必要があります。(PostConstructor で) 1 回だけ実行する必要があります。

        httpClient = new DefaultHttpClient();
        // Create a local instance of cookie store
        cookieStore = new BasicCookieStore();
        // Set the store
        httpClient.setCookieStore(cookieStore);

次に、クライアントの同じインスタンスを使用して呼び出しを実行します。クライアントは応答から Cookie を取得し、それを cookieStore に保存して、次の要求で送信します。

追加の説明が必要な場合はお知らせください。

よろしくお願いします、

マイケル

于 2013-03-10T19:54:56.913 に答える