如何将新的 header 传递给 sendRedirect

How to pass new header to sendRedirect

我觉得这应该很容易。我有一个应用程序,我想做的就是有一个表单页面 (index.jsp),它调用一个 servlet (CheckInfo.java),它设置一个新的 header (myHeader) 并重定向用户到另一页 (redirect.jsp)。所有这些文件都在同一台服务器上。 index.jsp 正在正常发送请求并且 CheckInfo 正在处理和重定向,但是 myHeader 没有出现在 redirect.jsp 上。我读过几篇讨论 response.sendRedirect 发送未通过 header 的 302 的帖子,我应该使用 RequestDispatcher,但似乎没有任何效果。没有办法将 headers 从 servlet 发送到 jsp 吗? 这是 servlet 代码:

response.setHeader("myHeader", "hey there");
response.sendRedirect("redirect.jsp");

我也试过这个:

response.setHeader("myHeader", "hey there");
RequestDispatcher view = request.getRequestDispatcher("redirect.jsp");
view.forward(request, response);

我在 redirect.jsp 中有这个:

System.out.println(request.getHeader("myHeader"));

这不会打印任何内容。

如果我的问题的答案是否定的...那么我会在回到 jsp 后找到一种设置 header 的方法。我的反向代理正在寻找特定的 header 来确定是否执行某个操作。显然,我在 redirect.jsp 上尝试了 response.addHeader(),但页面此时已经加载,这让我感到很愚蠢。

response.setHeader("myHeader", "hey there");
response.sendRedirect("redirect.jsp");

您正在将其添加为响应 header,它是 302 响应。看到 302 响应的浏览器将只查找 Location header 并向该位置发出新请求。响应中的自定义 header 未受影响,而您期望这些自定义响应 header 包含在未发送的请求(到新的重定向位置)中。

解决方法:-
1.您可以使用请求调度程序并转发请求而不是外部重定向。并且你需要在这里使用请求属性。

2. 您可以使用 ajax 请求调用提交表单,可能类似于 jquery 并手动处理响应(对于 302 响应),但不建议您使用这种方法,因为它不是更清晰和直观方法。只是提一下,让你知道还有其他方法可以实现这一目标。

客户端重定向创建一个新的 HTTP request/response 对。 这个link可能会在调试方面对你有更多帮助-

Sending Custom headers

问题是响应的 redirect() 方法完全启动了一个新请求,从而丢失了在重定向之前设置的属性。幸运的是,仍然有一种流畅的方法可以解决问题。见下文

response.setHeader("myHeader", "hey there"); request.getRequestDispatcher("redirect.jsp").forward(request, response);

然后在你的目的地你可以response.getHeaders("myHeader")

我已经测试了代码。

我希望很清楚,如果要求客户端重定向到另一个 URL - 浏览器不应接受 cookie。

但是,第二种方法-服务器转发请求的地方是可行的。主要错误似乎是在我们应该更改请求时更改 response

再一次,不能直接改变 HttpServletRequest object。这是一种方法:

HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request){
    public String getHeader(String name) {
        String value = super.getHeader(name);
        if(Strings.isNullOrEmpty(value)) {
            ...
            value = myNewHeader;
        }
        return value;
    }

    public Enumeration<String> getHeaders(String name) {
        List<String> values = Collections.list(super.getHeaders(name));
        if(values.size()==0) {
            ...
            values.add(myNewHeader);
        }
        return Collections.enumeration(values);
    }

    public Enumeration<String> getHeaderNames() {
        List<String> names = Collections.list(super.getHeaderNames());
        names.add(myNewHeaderName);
        ...
        return Collections.enumeration(names);
    }
}

其次是:

RequestDispatcher view = request.getRequestDispatcher("redirect.jsp");
// OR (If you can get servletContext)
RequestDispatcher view = servletContext.getRequestDispatcher("redirect.jsp");

view.forward(requestWrapper, response);

参考:

注意:可能无法将请求转发到需要不同 MIME 类型的端点。