2012-01-18 28 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