【问题标题】:How to set a header in an HTTP response?如何在 HTTP 响应中设置标头?
【发布时间】:2013-10-23 21:21:34
【问题描述】:

我有一个 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。请让我知道我在这里缺少什么。

【问题讨论】:

  • @Nambari,如果我想向 ServletB 发送用户 ID 信息,请告诉我,那么如何使用现有的标头进行设置?
  • 因为我要发送用户信息的另一个应用程序,它接受 SSO 实施的标头或 cookie。

标签: java http servlets http-headers


【解决方案1】:

首先你要了解它的本质

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

【讨论】:

    【解决方案2】:

    在我的控制器中,我只是添加了一个 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");
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-06-19
        • 2016-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-29
        • 2017-08-28
        • 1970-01-01
        • 2014-11-09
        相关资源
        最近更新 更多