【问题标题】:body in 301 http response301 http响应中的正文
【发布时间】:2013-05-25 16:30:33
【问题描述】:

我必须发送 301 响应代码。下面是我正在使用的代码:

        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();
        out.println(origReqBody);
        resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
        resp.setHeader("Location", homeSiteRedirUrl);

在这里我观察到,如果“origReqBody”为空白,则它正在发送 301,如果“origReqBody”有一些字符串,则代码正在发送 302。如果是 302,我可以看到 Location Header 在响应中可见4 次。

需要了解这种行为。我需要在 301 中发送尸体。可以吗?

编辑: 在 println 上面制作 setHeader 和 setStatus 后...

消息 7 和 11:如果“origReqBody”为空 消息 27、31:如果“origReqBody”不为空

同样的行为...我期待的是 301 而不是 302

【问题讨论】:

  • 很奇怪。我无法重现它。如果我放置位置标题(代码的最后一行),就好像我从未向out 打印任何内容。如果我不放置位置,那么它会打印出来。无论哪种方式,我的 servlet 都会返回一个 301
  • 您使用的是什么版本的 servlet?什么是容器?在方法的开头和结尾各放一个System.out.println("status: "+response.getStatus());,它们打印什么?
  • 使用 servlet 2.5 且 getStatus 不可用。我使用的容器(即 apache)嵌入在某些专有软件中。

标签: java http servlets


【解决方案1】:

PrintWriter 如果有内容,实际上会写入输出流,这需要它继续序列化标题和状态代码,因为它们在响应中排在第一位。所以它只是忽略了对setStatussetHeader 的后续调用。只需将这些调用移到println 上方,我敢打赌它会按您的预期工作。

【讨论】:

  • 你使用的是什么 servlet 容器?
  • 使用 servlet 2.5 且 getStatus 不可用。我使用的容器(即 apache)嵌入在某些专有软件中
  • @Isaac:它的工作。有一些业务逻辑问题,即如果正文来做发送重定向。谢谢你是对的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 2016-02-16
  • 2021-09-23
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
相关资源
最近更新 更多