如何在HTTP响应中设置标头?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在HTTP响应中设置标头?相关的知识,希望对你有一定的参考价值。

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

答案

首先,你必须了解其本质

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");
}
另一答案

在我的Controller中,我只是添加了一个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方法获取)。

以上是关于如何在HTTP响应中设置标头?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flask 中设置响应标头?

在 Express 中设置默认响应标头

访问前端代码中express.js中设置的标头

如何在 Apache Felix maven-bundle-plugin 中设置 Provide-Capability 标头?

如何在 WPF 应用程序中 SOAP 客户端的“Set-Cookie”标头响应的新请求中设置“Cookie”标头

如何抑制 X-Frame-Options SAMEORIGIN 响应标头?