18

HTTP 応答でヘッダーを設定しているサーブレットAがあります。

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");
}


しかし、ここでは userid の値null. ここで何が足りないか教えてください。

4

3 に答える 3

14

まず、その性質を理解する必要があります。

response.sendRedirect(newUrl);

クライアント(ブラウザ)に URL を含む 302 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");
}
于 2013-10-23T22:20:16.517 に答える
0

ヘッダー フィールドは後続のリクエストにコピーされません。これには Cookie (addCookie メソッド) を使用するか、「REMOTE_USER」をセッションに保存する必要があります (これは getSession メソッドで取得できます)。

于 2013-10-23T21:38:35.820 に答える