私はサーブレットを持っています[〜#〜] a [〜#〜] HTTPレスポンスにヘッダーを設定しています:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName=request.getParameter("userName");
String newUrl = "http://somehost:port/ServletB";
response.addHeader("REMOTE_USER", userName);
response.sendRedirect(newUrl);
}
サーブレットで[〜#〜] b [〜#〜]、サーブレットに設定されたヘッダー値を取得しようとしています[〜#〜] a [〜 #〜]:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userid = request.getHeader("REMOTE_USER");
}
しかし、ここではseridの値はnull
になっています。ここで何が欠けているのか教えてください。
まず、あなたはの性質を理解する必要があります
response.sendRedirect(newUrl);
クライアント(ブラウザ)302 URLにHTTPコード応答を提供しています。その後、ブラウザはそのURLで別のGET要求を行います。そして、そのリクエストは最初のヘッダーのヘッダーを知りません。
そのため、サーブレットAからサーブレットBにヘッダーを渡す必要がある場合、sendRedirectは機能しません。
このコードを機能させる場合は、(sendRedirectの代わりに)サーブレットAでRequestDispatcherを使用します。また、相対パスを使用することを常にお勧めします。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String userName=request.getParameter("userName");
String newUrl = "ServletB";
response.addHeader("REMOTE_USER", userName);
RequestDispatcher view = request.getRequestDispatcher(newUrl);
view.forward(request, response);
}
========================
public void doPost(HttpServletRequest request, HttpServletResponse response)
{
String sss = response.getHeader("REMOTE_USER");
}
コントローラーにHttpServletResponseパラメーターを追加し、ヘッダーを手動で追加しただけです。フィルターやインターセプトは不要で、正常に機能します。
httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS");
httpServletResponse.setHeader("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept, X-Auth-Token, X-Csrf-Token, WWW-Authenticate, Authorization");
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "false");
httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
ヘッダーフィールドは後続のリクエストにはコピーされません。これにはcookie(addCookieメソッド)を使用するか、セッションに「REMOTE_USER」を保存する必要があります(getSessionメソッドで取得できます)。