HttpServletResponse sendRedirect permanent

70

这将使用一个临时302 HTTP状态码重定向请求:

HttpServletResponse response;
response.sendRedirect("http://somewhere");

但是是否可以使用永久的301 HTTP状态码进行重定向呢?

2个回答

119

你需要手动设置响应状态和Location头。

response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location", "http://somewhere/");

sendRedirect() 前设置状态是行不通的,因为 sendRedirect() 会在之后将其覆盖为 SC_FOUND


使用指定的重定向位置URL向客户端发送临时重定向响应。好的 - 你是对的。实际上,我认为它的行为方式类似于在设置状态后使用sendError的方式。因此,在我的帖子中尝试设置xD。 - chzbrgla
3
sendError() 方法需要状态码作为参数,而 sendRedirect() 方法则不需要。无论当前状态如何,sendRedirect() 都会默认设置 302 状态码。 - BalusC
10
谢谢,这个有效。为了提交响应,您还需要刷新缓冲区:response.flushBuffer(); - z12345
@k12345:容器应该隐式地完成这个任务。实际上,你不需要往响应体中写入任何内容。 - BalusC
@z12345是正确的。没有response.flushBuffer();它不起作用。 - egemen
1
@egemen:可能并不是必要的。你可能在设置响应状态后错误地继续了代码流程(例如,转发到某个JSP而不是从方法返回),或者你遇到了服务器中的一个错误。在这种情况下,请向Servlet容器供应商报告问题。 - BalusC

-1
我使用了以下代码,但对我没有起作用。
String newURL = res.encodeRedirectURL("...");
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.sendRedirect(newURL);

然后我尝试了这段代码,它对我起作用了

String newURL = res.encodeRedirectURL("...");
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location", newURL);

这对我有用,我也遇到了同样的问题。

如何在重定向时设置状态为301


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接