如何将新标头传递给sendRedirect

时间:2016-01-24 03:51:19

标签: servlets redirect http-headers

我觉得这应该很容易。我有一个应用程序,其中我想要做的是有一个表单页面(index.jsp)调用servlet(CheckInfo.java),它设置一个新的标头(myHeader)并将用户重定向到另一个页面(redirect.jsp) 。所有这些文件都在同一台服务器上。 index.jsp发送请求很好,CheckInfo正在处理和重定向,但myHeader没有显示在redirect.jsp上。我已经阅读了几篇关于response.sendRedirect的帖子发送了一个302,它没有传递头文件,我应该使用RequestDispatcher,但似乎没有任何工作。有没有办法从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,我就会想办法设置标题。我的反向代理正在查找特定标头以确定是否执行操作。显然我在redirect.jsp上尝试了response.addHeader(),但是那个页面已经加载了,所以这让我感到愚蠢。

4 个答案:

答案 0 :(得分:3)

Location

您将其添加为响应标头,它是302响应。看到302响应的浏览器将只查找 00000000;Pikachu Muchacho;region1 11111111;SoSo good;region2 22222222;Marshaw williams;region3 33333333;larry Mikal Carter;region3 标头并向该位置发出新请求。响应中的自定义标头不受影响,而您希望这些自定义响应标头包含在未发送的请求(到新的重定向位置)中。

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

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

答案 1 :(得分:1)

我希望很明显,在要求客户端重定向到另一个URL的情况下,浏览器将不接受Cookie。

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

然后,不能再直接改变HttpServletRequest对象。这是一种方法:

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类型的端点。

答案 2 :(得分:0)

客户端重定向会创建新的HTTP请求/响应对。 此链接可以帮助您更多地调试透视图 -

Sending Custom headers

答案 3 :(得分:0)

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

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

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

我已经测试了代码。