2012-01-18 33 views
2

嘿,从包含url的java servlets之间重定向#

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

的事情是,当你的浏览器指向URL包含#

http://anydomain.com/test/elsem/1234#dogeatdog 

,由于某种原因(即有一个业务逻辑)要重定向到其他页面

http://anydomain.com/test/els/1234 

#dogeatdog将被添加到新的网址。

我在开发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

出于好奇 - 做同样的事情,当你做一个前锋,而不是重定向的发生呢? – 2012-01-18 20:47:51

+0

按照@ Zack的说法,我建议你使用'RequestDispatcher'来试试这个。 – everton 2012-01-18 20:56:28

+0

我还没试过 – kamiseq 2012-01-19 16:32:58

回答

0

sendRedirect Javadoc

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

由于重复使用的的“相对”在Javadoc,我怀疑新的URL是用什么可以从旧的URL,然后从那里建设中...

在短暂的量我读过的,如果可能的话,应该使用转发,而不是重定向。

请参阅this以获得对向前经文重定向的很好的解释。

请参阅this以获得转发Servlet或JSP请求的直接示例。

当然,与转发,原来的网址将保持不变,这样可能不是你要找的内容...

编辑
来自米兰的信息,我发现对于一些更多的信息URL片段(“#”之后的东西 - 我不知道这是他们的正式名称,直到与米兰相对应)。

有有关于这一点,可能是最好的回答一些好的信息,另一个SOF后:URL Fragment and 302 redirects

我有“+1”为这个提供良好的方向米兰...

4

哈希段(#a_hash_fragment)永远不会离开浏览器,它们不是HTTP请求的一部分。

什么Web服务器在这种情况下得到的是GET /test/elsem/1234,并将其与重定向3XX代码和新的URL /test/els/1234回应,而您的浏览挑选,并附加#dogeatdog。现在有道理吗?

UPDATE:感谢扎克,这里有一个W3C文件恰好解释了如何(应该)工作: http://www.w3.org/Protocols/HTTP/Fragment/draft-bos-http-redirect-00.txt

+0

当我从http://stackoverflow.com/faq#questions去http://stackoverflow.com/about时,哈希片段不会留在浏览器中(至少在使用Chrome时)。 – 2012-01-19 12:55:49

+0

是否有一个“官方”文档说明你对散列碎片的描述?我要求更多的好奇心和学习的缘故... – 2012-01-19 12:57:38

+0

谁说片段总是呆在那里?我说这是在你获得3xx重定向响应时发生的。尝试在重定向的页面上,只需追加任何散列并查看会发生什么。 – milan 2012-01-19 12:59:14