1

JBOSSでサーバーを実行しています。すべてのリクエストをリッスンするものがFilterあります。つまり、すべてのリクエストがフィルターに送られ、Servletsここから他のリクエストに渡されます。これに気づきました:

次のコードを使用すると、フィルターのみが呼び出されますが、制御はそれぞれのサーブレットに渡されません(フィルターは、を使用して印刷すると正しいサーブレットを印刷しrequest.getRequestURI()ます。また、リクエストヘッダーの正しい値をusername印刷します。 password

 HttpURLConnection connection=gs.getconnection("send_user_detail");
          connection.setRequestProperty("user", gs.get_login_id());
          connection.setRequestProperty("password", gs.get_pass());
        connection.setRequestProperty("timezone", TimeZone.getDefault().getDisplayName());
            connection.connect();

しかし、次のコードを使用すると、制御はそれぞれに渡され、Servlet正常に機能します。

 HttpURLConnection connection=gs.getconnection("send_user_detail");
          connection.setRequestProperty("user", gs.get_login_id());
          connection.setRequestProperty("password", gs.get_pass());
        connection.setRequestProperty("timezone", TimeZone.getDefault().getDisplayName());
            //connection.connect();
 ObjectOutputStream out=new ObjectOutputStream(connection.getOutputStream());
          out.writeObject("string"); //some random string not used in the servlet


したがって、OutputStreamに何かを書き込んだ場合にのみ、制御がサーブレットに渡されます。しかし、を使用するとconnection.connect()、それでもフィルターに到達し、要求されたの正しい名前を出力しますServlet。理由は何ですか?

4

2 に答える 2

3

リクエスト本文への書き込みは、URLConnectionHTTPPOSTリクエストを意味します。

サーブレットは、doPost()ではなく、でジョブを実行しているようdoGet()です。

doGet()サーブレットがHTTPGETリクエストに対応するようにするには、でジョブを実行する必要があります。

これはフィルターとはまったく関係ありません。フィルタを削除するときにもまったく同じ問題が発生します。


具体的な問題とは関係なく、connection.setRequestProperty()行はリクエストパラメータではなくリクエストヘッダーを設定します。ヘッダーをパラメーターとして悪用していないことを確認してください(不適切な設計)。POSTの場合、リクエストパラメータはリクエスト本文にURLエンコードされたクエリ文字列として書き込む必要があります。

参照:

于 2012-11-12T12:49:58.467 に答える
0

フィルタはチェーンで機能します。フィルタ契約は次のとおりです。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException

通常、フィルターはいくつかの作業を行い、呼び出します

chain.doFilter(request, response);

フィルタは、フィルタチェーン呼び出しの前または後にその作業を実行できることに注意してください。途中でサーブレットの前に呼び出しが呼び出される前のコード。サーブレットの後、途中で呼び出しが呼び出された後のコード。

チェーンには多くのフィルターが存在する可能性があり、チェーンは順序付けられていることに注意してください。チェーン内のフィルターは、フィルターチェーン呼び出しを見逃す可能性があります。これにより、リクエストがチェーンのさらに上に伝播し、最終的にサーブレットに到達するのを防ぐことができます。

あなたの場合、これが起こっているのではないかと思います。

編集: 2番目の例で、最初の例でエラーがスローされている可能性
があるという呼び出しをコメントアウトしていることに気づきましたか?connection.connect();

于 2012-11-12T12:37:11.503 に答える