1

私は現在、OpenID4Java ライブラリを使用して Java HttpServlets で OpenID Relying Party (RP) と ID プロバイダー (IdP) を実装しています。2 つのサーブレットが相互に通信する際に問題が発生しました。私が抱えている問題は、サーブレットの動作をさらに改善することだと思いますが、何が起こっているのかをよりよく理解するために、アプリケーションに関する情報を含めました。

シナリオは次のとおりです。

サーブレット #1 (私の RP) は、次のようにサーブレット #2 (私の IdP) にリクエストを送信します。

httpResp.sendRedirect(authReq.getDestinationUrl(true));

基本的に authReq = さまざまな OpenID 固有のパラメーターを含むメッセージ。getDestinationUrl(true) を呼び出すことで、リクエストを GET 経由で送信する URL にエンコードします。

サーブレット #2 は、doGet メソッドで上記の GET をキャッチします。情報を解析し、応答を作成して、次の方法でサーブレット #1 に送り返します。

文字列 responseText = processRequest(httpReq, httpResp);

        httpResp.setContentType("text/html");
        OutputStream outputStream = httpResp.getOutputStream();
        //
        outputStream.write(responseText.getBytes());
        outputStream.close();

私の問題は、この応答がサーブレット #1 に戻らないことです。サーバー #1 がサーブレット #2 から応答を受信すると、その doGet または doPost メソッドがメッセージをキャッチすることを期待します。ただし、どちらの場合も発生しません。

アドバイスをいただければ幸いです。

ありがとう!

4

3 に答える 3

1

2番目のサーブレットの応答は、クライアント側に直接送信されます。これは元のクライアントですよね?最初のサーブレットはリクエストをリダイレクトしているだけです。

したがって、サーブレット間で通信したい場合は、URLConnectionorApache HttpClientを使用して 2 番目のサーブレットと通信します。

2 番目のサーブレットの代わりに JSP を作成し、1 番目のサーブレットからその JSP にデータを渡すこともできます。その後、その JSP の応答がクライアントに送信されます。結局のところ、サーブレットでできることはすべて JSP で行うことができます。

お役に立てれば。

パート。

于 2010-07-30T06:51:41.493 に答える
0

アプリケーション内で 2 つのサーブレットが相互に通信するようにする場合は、ServletContext オブジェクトを使用して、ServletContext.setAttribute およびorServletContext.getAttributeを介して取得した RequestDispatcher を介してデータを共有できます。HttServletRequestServletContext

あなたの場合、Servlet#2 はクライアントから直接呼び出すことができますか? そうでない場合は、おそらく processRequest(request, response) をユーティリティ クラスまたはライブラリにリファクタリングする必要があります。これは、Servlet#1 と Servlete#2 の両方から呼び出すことができます。

response.sendRedirectブラウザにリダイレクト(301は永久に移動したと思います)を送信します。したがって、サーブレットは実際にブラウザに 301 で応答を送信し、ブラウザは再びサーブレット #2 にリクエストを送信します。

于 2010-07-30T07:13:02.340 に答える
0

RequestDispatcher を使用して、2 番目のサーブレットの応答を含めることができます。このようにして、メソッドが完了すると、制御は最初のサーブレットに戻ります。

RequestDispatcher dispatcher = request.getRequestDispatcher(authReq.getDestinationUrl(true));
dispatcher.include(request, response);

ただし、これにより、呼び出されたサーブレットによって生成された応答がブラウザーに送信されます。呼び出し元のサーブレットが、ブラウザーに送信せずに呼び出されたサーブレットからのメッセージをキャプチャするようにする場合は、応答ラッパー (コンテンツを文字列に書き込むラッパー) を作成し、共有できる 2 番目のサーブレットまたはより良いものを含めるときにこのラッパーを渡すことができます。スコープのいずれか (できれば「リクエスト」スコープ) のデータ: 呼び出されたサーブレットのリクエスト スコープにデータを設定し、include() の完了後に呼び出し元のサーブレットでデータを取得できます。

リダイレクトすると、ブラウザーに URL の新しい要求を行うように指示することになります。そのため、ページ内のリンクをクリックしたかのように、新しい要求/応答オブジェクトが作成されます。

お役に立てれば。

于 2010-07-30T07:42:33.813 に答える