4

次のコードでは、JDK の URLConnection クラスが使用されている場合、アプレット内から URL に接続するとブラウザのセッションが維持されることを確認しました。ただし、Apache の HttpClient ライブラリを使用する場合はこの限りではありません。誰かが理由を知っていますか?または、接続インスタンスを HttpClient インスタンスで使用するように設定する方法はありますか?

import java.applet.Applet;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URISyntaxException;
import java.net.URL;

import javax.net.ssl.SSLException;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

public class HttpClientTesterApplet extends Applet {
    private static final long serialVersionUID = -1599714556710568947L;

    public void testHttpClient() throws ClientProtocolException, IOException,
            URISyntaxException {
        URL url = new URL(String.format("%s://localhost:%s/%s/testHttpClient",
                getParameter("protocol"), getParameter("port"),
                getParameter("context")));

        HttpClient client = new DefaultHttpClient();

        HttpPost post = new HttpPost(url.toURI());

        System.out.println("Executing request " + post.getURI());

        try {
            System.out
                    .println(client.execute(post, new BasicResponseHandler()));
        } catch (SSLException e) {
            System.out.println(e.getMessage());
        }

        System.out.println("Executed request " + post.getURI());

        System.out.println("Opening connection " + url);

        HttpURLConnection urlConnection = (HttpURLConnection) url
                .openConnection();

        System.out.println("Opened connection " + url);

        urlConnection.setRequestMethod("POST");

        System.out.println("Connecting");

        urlConnection.connect();

        System.out.println("Connected");

        InputStream inputStream = urlConnection.getInputStream();

        try {
            while (inputStream.read() != -1) {
                System.out.println("Reading");
            }
        } finally {
            inputStream.close();
        }
    }
}
4

6 に答える 6

3

これは、Socketを介して独自のURL接続を実装するライブラリでよくある問題です。どうやら、URLConnectionクラスのJRE実装は、ブラウザ情報に直接アクセスできます。上記のoscargmで説明した手法を採用する必要がありました。つまり、アプレットへのパラメータとしてリクエストCookieを書き込み、JavaScriptを使用してブラウザのドキュメントCookieにアクセスするアプリサーバーで使用する必要がありました(これは、Cookieのセットが使用されるSSOの場合です。中間エージェント(プロキシサーバー)のため、同じではありません。CookieがHttpOnlyの場合、javascriptコードは失敗することに注意してください。

于 2009-10-28T16:58:06.077 に答える
2

を使用するには、Cookieを送信するjsessionidか、URL を書き換える必要がありますjsessionid

これが、サーバーがセッションを認識する方法です。

appletJSP ページでタグを動的に生成する場合は、jsessionid値をパラメータとしてアプレットに渡してから使用できます。

post.setHeader("Cookie", "jsessionid=" + jsessionidValue );
于 2009-08-08T19:09:49.243 に答える
1

古いバージョンのHttpClientを使用していると思います。HttpClientのWebサイトを確認してください。

現在のAPIでは、executeメソッドでHttpStateを使用できるため、コードは次のようになります。

HttpClient client = new HttpClient();
HttpMethod method = new PostMethod(url.toURI());
HttpState state = new HttpState();

client.executeMethod(HttpConfiguration.ANY_HOST_CONFIGURATION, method, state);

次の実行では、同じ「状態」オブジェクトを渡すと、資格情報とCookieが保持されます。

于 2009-08-08T15:06:19.193 に答える
0

このコードを使用して、Webページから引数としてCookieを渡さなくても機能させることができます。

private String retrieveCookies(URL url) throws IOException, URISyntaxException 
{ 
     String cookieValue = null;

     CookieHandler handler = CookieHandler.getDefault();
     if (handler != null)    {
          Map<String, List<String>> headers = handler.get(url.toURI(), new HashMap<String, List<String>>());

          List<String> cookiesList = headers.get("Cookie");
          if (cookiesList != null)
          {
              for (String v : cookiesList) {
                  if (cookieValue == null) 
                      cookieValue = v; 
                  else
                      cookieValue = cookieValue + ";" + v; 
              }
          }
     } 
     return cookieValue; 
}

...

httppost.addHeader("Cookie", retrieveCookies(new URL(uploadUrl)));

JDKのクラスCookieHandlerは、幸いなことに「システム」ストアからCookieを取得できます。この場合、Javaプラグインを介してアクセスされるブラウザストアです。

一種の「手作業」ですが、機能します。

注:ここでコードを見つけました

于 2011-01-25T09:04:34.140 に答える
0

ティは重要な問題です。

標準のjava.net.URLConnectionクラスは、JavaプラグインおよびWebブラウザーとシームレスに統合され、セッション、HTTP認証トークン、プロキシコネクターなどを継承できます。

Apache Commonsのメンバーは、標準のjava.net.URL *クラスの上に開発するだけでなく、Socketから(つまり、最初から)HttpClientを実装することを決定したときに大きな間違いを犯しました。HttpClientはjava.net.URLConnectionを継承しないため、高度なエンタープライズ機能を継承できません。

たぶん、OpenSourceプロジェクトは彼らが思っているほど賢くないでしょう。

于 2010-11-25T20:31:05.647 に答える
0

考えられる原因は、URLConnection を使用するときに disconnect() を行っていないことですが、それが完了すると、Apache ライブラリは接続を閉じます。

于 2009-08-04T05:35:51.307 に答える