嗨,
也许标题不是最佳选择,但我真的不知道如何更好地描述问题。
当您将浏览器指向包含#
的网址时http://anydomain.com/test/elsem/1234#dogeatdog
由于某种原因(即有一个业务逻辑)你想重定向到其他页面
http://anydomain.com/test/els/1234
#doatatdog 将添加到新网址。
我在开发wicket应用程序时发现了这种行为,但刚才我用简单的纯java servlet测试了它。有人可以向我解释一下吗?
以下代码是为了防止我做错了什么:
private void process(HttpServletRequest req, HttpServletResponse res)
{
res.setContentType("text/plain");
try
{
HttpSession session = req.getSession();
Object as = session.getAttribute("as");
if (as == null)
{
log.info("redirecting");
session.setAttribute("as", 1);
res.sendRedirect("/test/");
}
else
{
log.info("writing");
PrintWriter out = res.getWriter();
out.write("after redirect "+as);
out.flush();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
答案 0 :(得分:4)
散列片段(#a_hash_fragment)永远不会离开浏览器,它们不属于HTTP请求。
在这种情况下,网络服务器获得的是GET /test/elsem/1234
,它会使用重定向3xx代码和新网址/test/els/1234
进行响应,您的浏览器会选择并追加#dogeatdog
。现在有道理吗?
更新:感谢Zack,这是一个W3C文档,它准确地解释了这个(应该)如何工作: http://www.w3.org/Protocols/HTTP/Fragment/draft-bos-http-redirect-00.txt
答案 1 :(得分:0)
使用指定的方法向客户端发送临时重定向响应 重定向位置网址。此方法可以接受相对URL;该 servlet容器必须将相对URL转换为绝对URL 在将响应发送给客户端之前。如果位置是相对的 如果没有前导'/',容器会将其解释为相对于 当前请求URI。如果位置是相对的前导'/' 容器将其解释为相对于servlet容器根目录。
由于在Javadoc中重复使用“relative”,我怀疑新网址正在使用旧网址中的内容,然后从那里构建...
在我所阅读的内容中,如果可能,应使用转发而不是重定向。
有关前向文字重定向的详细说明,请参阅this。
有关向Servlet或JSP转发请求的直接示例,请参阅this。
当然,通过转发,原始网址将保持不变,因此可能不是您想要的...
修改的
根据米兰的信息,我发现了一些关于 URL片段的更多信息(“#”之后的东西 - 我不知道这是他们的官方名称,直到与米兰相对应)。
还有另一篇SOF帖子,其中包含一些有关此内容且可能是最佳答案的良好信息:URL Fragment and 302 redirects
我有“+ 1'd”米兰为此提供了良好的指导...