【问题标题】:How to pass new header to sendRedirect如何将新标头传递给 sendRedirect
【发布时间】:2016-04-30 13:07:18
【问题描述】:

我觉得这应该很容易。我有一个应用程序,我想做的只是有一个表单页面(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(),但是页面已经加载了,所以这让我觉得很愚蠢。

【问题讨论】:

    标签: servlets redirect http-headers


    【解决方案1】:
    response.setHeader("myHeader", "hey there");
    response.sendRedirect("redirect.jsp");
    

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

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

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

    【讨论】:

    • 我更新了我的问题以包括我为您的解决方案 1 尝试的内容。RequestDispatcher 也不起作用。
    • 你需要使用请求属性。试试这个,让您知道您现在面临什么问题。
    • 我不明白我应该如何使用请求属性。可以举个例子吗?
    • 在调用请求调度程序转发之前使用 request.setAttribute('myHeader',String or object value) 。在您的 redirect.jsp 中,使用 request.getAttribute("myHeader") 。 type 将值转换为 String 或您使用的任何 Object 类型。
    【解决方案2】:

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

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

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

    我已经测试了代码。

    【讨论】:

      【解决方案3】:

      我希望在要求客户端重定向到另一个 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 类型的端点。

      【讨论】:

        【解决方案4】:

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

        Sending Custom headers

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-09-18
          • 1970-01-01
          • 2014-11-04
          • 1970-01-01
          • 1970-01-01
          • 2016-08-25
          • 2018-09-21
          相关资源
          最近更新 更多