18

我有一个 servlet 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);
}

现在在 servlet B中,我试图获取在 servlet 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 请求。并且该请求不知道第一个请求中的标头。

因此,如果您需要将标头从 Servlet A 传递到 Servlet B,则 sendRedirect 将不起作用。

如果您希望此代码工作 - 在 Servlet A 中使用 RequestDispatcher(而不是 sendRedirect)。此外,使用相对路径总是更好。

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 回答
3

在我的控制器中,我只添加了一个 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");
于 2018-08-31T20:07:20.933 回答
0

标头字段不会复制到后续请求。您应该为此使用 cookie(addCookie 方法)或在会话中存储“REMOTE_USER”(您可以使用 getSession 方法获取)。

于 2013-10-23T21:38:35.820 回答