Servlets 如何将新标头传递给sendRedirect

Servlets 如何将新标头传递给sendRedirect,servlets,redirect,http-headers,Servlets,Redirect,Http Headers,我觉得这应该很容易。我有一个应用程序,我所要做的就是有一个表单页面(index.jsp),它调用一个servlet(CheckInfo.java),设置一个新的头(myHeader),并将用户重定向到另一个页面(redirect.jsp)。所有这些文件都在同一台服务器上。jsp正在发送请求,CheckInfo正在处理和重定向,但是myHeader没有显示在redirect.jsp上。我读过几篇关于response.sendRedirect的帖子,它们发送一个302,不传递头,我应该使用Reque

我觉得这应该很容易。我有一个应用程序,我所要做的就是有一个表单页面(index.jsp),它调用一个servlet(CheckInfo.java),设置一个新的头(myHeader),并将用户重定向到另一个页面(redirect.jsp)。所有这些文件都在同一台服务器上。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(),但此时页面已经加载了,这让我感觉很傻

response.setHeader("myHeader", "hey there");
response.sendRedirect("redirect.jsp");
您正在将其添加为响应头,它是302响应。浏览器在看到302响应时只会查找
位置
标题,并向该位置发出新请求。响应中的自定义头未被触及,而您希望这些自定义响应头包含在未发送的请求(到新重定向位置)中

解决方案:-

1.您可以使用请求调度器转发请求,而不是外部重定向。您需要在此处使用请求属性。

2.您可以使用类似jquery的ajax请求调用submit表单并手动处理响应(对于302响应),但不建议您使用这种方法,因为它不是一种更干净、更直观的方法。只需提及,以便您知道还有其他方法可以实现这一点

您正在将其添加为响应头,它是302响应。浏览器在看到302响应时只会查找
位置
标题,并向该位置发出新请求。响应中的自定义头未被触及,而您希望这些自定义响应头包含在未发送的请求(到新重定向位置)中

解决方案:-

1.您可以使用请求调度器转发请求,而不是外部重定向。您需要在此处使用请求属性。


2.您可以使用类似jquery的ajax请求调用submit表单并手动处理响应(对于302响应),但不建议您使用这种方法,因为它不是一种更干净、更直观的方法。仅提及这一点,以便您知道还有其他方法可以实现这一点。

客户端重定向将创建一个新的HTTP请求/响应对。 此链接可能会帮助您了解调试方面的更多信息-


客户端重定向将创建新的HTTP请求/响应对。 此链接可能会帮助您了解调试方面的更多信息-


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

response.setHeader(“myHeader”,“你好”);
getRequestDispatcher(“redirect.jsp”).forward(请求,响应)

然后在您的目的地,您可以执行
response.getHeaders(“myHeader”)


我已经测试了代码。

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

response.setHeader(“myHeader”,“你好”);
getRequestDispatcher(“redirect.jsp”).forward(请求,响应)

然后在您的目的地,您可以执行
response.getHeaders(“myHeader”)


我已经测试了代码。

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

然而,服务器转发请求的第二种方法是可行的。主要的错误似乎是在我们应该更改请求时,对
响应进行了变异

同样,不能直接改变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);
    }
}
参考:

    • 对于headers案例,需要重写reqWrapper obj中的-getHeader()、getHeaderNames()和getHeaderNames()fn
    • 同样,您可以覆盖cookie和参数
  • 另见:

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

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

然而,服务器转发请求的第二种方法是可行的。主要的错误似乎是在我们应该更改请求时,对
响应进行了变异

同样,不能直接改变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);
    }
}
参考:

    • 对于headers案例,需要重写reqWrapper obj中的-getHeader()、getHeaderNames()和getHeaderNames()fn
    • 同样,您可以覆盖cookie和参数
  • 另见:

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

我更新了我的问题,以包括我为解决方案1所做的尝试。RequestDispatcher也不工作。您需要使用请求属性。试试这个,让我知道你现在面临什么问题。我不明白应该如何使用请求属性。你能给我举个例子吗?使用request.setAttribute('myHeader',String或object value