0

私は以下をアーカイブしようとしています:

1)エンドユーザーはサーブレットに投稿します(GWと呼びます)-GWは、次のリクエストに備えてセッションを保存します。

2)GWが受信するすべてのリクエストに対して、GWは別のサーブレットに投稿します(APIと呼びます)

3)GWのみがAPIに投稿でき(SSLで保護)、両方に固定IPがあります(ただし、この問題とは関係ありません)

4)APIに投稿されたすべてのリクエストについて、APIは将来のリクエストのためのセッションも維持する必要があります。

5)GWは、次の実装を使用してAPIに投稿しています。

try {
    HttpPost httppost = new HttpPost(uri);
    CookieStore cookieStore = new BasicCookieStore();
    HttpContext httpContext = new BasicHttpContext();
    httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

    HttpResponse response = httpclient.execute(httppost, httpContext);

} finally {
    httpclient.getConnectionManager().shutdown();
}

6)APIは次のようにリクエストを受け取ります。

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    HttpSession session = req.getSession(false);
    // isSessionValidFromURL = req.isRequestedSessionIdFromURL();
    // isSessionValidFromCookie = req.isRequestedSessionIdFromCookie();
    isSessionValid = req.isRequestedSessionIdValid();
    if (isSessionValid) {
        ...
        ...
    }
...
}

7)APIでは、リクエストが新しいリクエストの場合、新しいセッションを作成し、パラメータをDBに保存し、グローバルなどを構築します。

問題は、ログイン(GWがログインをAPIに送信)コマンドが送信された後、APIがこれまでのところ良好な新しいセッションを作成することです。2番目のコマンドでは、次のコード行でセッションの検証に失敗します。

isSessionValid = req.isRequestedSessionIdValid();
isSessionValidFromURL = req.isRequestedSessionIdFromURL();
isSessionValidFromCookie = req.isRequestedSessionIdFromCookie();

すべてfalseを返します。上記のようにCookieメカニズムを使用してセッションIDを送信しようとしましたが、受信したセッションIDをURLから送信しようとしましたが成功しませんでした。

さらに、私はこれこれを試しましたが成功しませんでした。ありがとう

編集:解決策この素晴らしい投稿はURLを介して渡されます(SSLであるため、セキュリティ違反にはなりません)

4

2 に答える 2

1

この問題の1つの解決策は次のとおりです。

...
...
httpclient.setHttpRequestRetryHandler(myRetryHandler);

uri = AppInit.fieldProxyURI + ";jsessionid=" + sessionInfo.getAttribute(GatewayConstants.PROXYSESSIONID);
HttpPost httppost = new HttpPost(uri);
nvps =(List<NameValuePair>) sessionInfo.getAttribute(GatewayConstants.PROXY_QUERY_PARAMS);
httppost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
ProxyPoster thread = new ProxyPoster(httpclient,httppost,sessionInfo,localContext);
thread.start();
thread.join();

} finally {
// leave the connection resource open
}

static class ProxyPoster extends Thread {
    //fields here..

    // constructor here...

@Override
public void run() {
    try {
        HttpResponse response = httpClient.execute(httppost, context);
        // proccess response
    } catch (Exception e) {
        httppost.abort();
    }
}

このようにして、セッションが維持され、httpclient接続が開いたままになり、受信したセッションIDがURLを介して送信されます。これが他の人に役立つことを願っています...

于 2013-01-02T13:41:14.897 に答える
0

サーバーフォワードであるため、HTTPフォワーディングを使用することをお勧めします。したがって、リクエストデータは次のアクションに繰り越されます。

リダイレクト中はサーバーがトリップし、リクエストデータが失われます。

于 2012-12-31T14:41:19.497 に答える