サーブレットと JSP をロードするためのカスタム規則を実装するフィルターがあります。その規則では、次のコードを使用してサーブレットを含めています。
servletContext
.getRequestDispatcher( uriDispatcherLocator.getServletLocation( uri ) )
.include( request, response );
JSP を含める次のコード (同じフィルター内):
servletContext
.getRequestDispatcher( "/index.jsp" )
.include( request, response );
すべてが正常に機能し、サーブレットが実行され、JSP が組み込まれ、無関係なカスタム ルールが実行されます。ご覧のとおり、リクエスト ディスパッチャーを使用してサーブレットをインクルードした瞬間に、クライアントに HTTP ヘッダー レスポンスを送信できません。問題は、サーブレットがフィルター内から呼び出されたかのように応答を完全に制御できるようにすることです (フィルターは、プロジェクト ファイル システム内のそれぞれのクラス/JSP の場所に従ってサーブレットを動的にマッピングする以外に何もしないため) )。.forward()
の代わりにを使用できますが、使用する.include()
と、サーブレットの実行後に JSP を含めることができなくなります。
では、RequestDispatcher インターフェイスを介してフィルターを介してサーブレットが含まれている場合、サーブレットが以下のコードを実行できるようにするにはどうすればよいでしょうか?
response.sendRedirect( "/somePath" );
Javascript のハッキングはありません。サーバーから適切な HTTP 応答を送信して、ブラウザが正しく動作するようにします。
--
編集:言い換えれば:
RequestDispatcher を使用して、含まれているサーブレットの内側からクライアントに送信されるヘッダーを変更したいのですが、ドキュメントには次のように記載されています。
The included servlet cannot change the response status code or set headers; any attempt to make a change is ignored.