从包含#的url重定向java servlet

时间:2012-01-18 20:02:31

标签: java servlets redirect

嗨,

也许标题不是最佳选择,但我真的不知道如何更好地描述问题。

当您将浏览器指向包含#

的网址时
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();
    }
}

2 个答案:

答案 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)

来自sendRedirect Javadoc

  

使用指定的方法向客户端发送临时重定向响应   重定向位置网址。此方法可以接受相对URL;该   servlet容器必须将相对URL转换为绝对URL   在将响应发送给客户端之前。如果位置是相对的   如果没有前导'/',容器会将其解释为相对于   当前请求URI。如果位置是相对的前导'/'   容器将其解释为相对于servlet容器根目录。

由于在Javadoc中重复使用“relative”,我怀疑新网址正在使用旧网址中的内容,然后从那里构建...

在我所阅读的内容中,如果可能,应使用转发而不是重定向。

有关前向文字重定向的详细说明,请参阅this

有关向Servlet或JSP转发请求的直接示例,请参阅this

当然,通过转发,原始网址将保持不变,因此可能不是您想要的...

修改
根据米兰的信息,我发现了一些关于 URL片段的更多信息(“#”之后的东西 - 我不知道这是他们的官方名称,直到与米兰相对应)。

还有另一篇SOF帖子,其中包含一些有关此内容且可能是最佳答案的良好信息:URL Fragment and 302 redirects

我有“+ 1'd”米兰为此提供了良好的指导...