java web 中的转发和重定向路径问题
為什么80%的碼農都做不了架構師?>>> ??
????假設應用程序的 contextPath 為 /ctx,在 http://localhost:8080/ctx/a/b 資源中,我們轉發和重定向到 http://localhost:8080/ctx/x/y 資源,分別應該怎么寫?
????轉發,是在同一個應用程序中,請求從由資源 A 處理,到由資源 B 處理。資源 A 和資源 B 屬于同一個應用程序的資源,它們總是相對于該應用程序的 contextPath 而言的。轉發的資源可以使用相對路徑(不以 "/" 開頭)和絕對路徑(以 "/" 開頭,這里的絕對,其實也是相對于某個環境而言的)。轉發的資源若使用 "/" 開頭,代表的是該資源在該應用程序中是絕對的,注意,是在應用程序的這個前提下是絕對的。
????資源 A = http://localhost:8080/ctx/a/b,資源 B = http://localhost:8080/ctx/x/y。在資源 A 中 getRequestDispatcher("/x/y"),由于是以 "/" 開頭,因此在應用程序內部是絕對的,即在 http://localhost:8080/ctx 這個環境下,/x/y 代表的是絕對地址。注意,我并沒有寫 getRequestDispatcher(request.getContextPath() + "/x/y"),這樣寫的話,同樣是在 http://localhost:8080/ctx 這個環境下的絕對地址為 request.getContextPath() + "/x/y",那么完整的資源是 http://localhost:8080/ctx/ctx/x/y,并不是我們所期望的資源。
????在資源 A 中 getRequestDispatcher("x/y") 會如何呢?由于轉發的資源不是以 "/" 開頭,因此它是一個相對地址,相對于誰呢?相對于做轉發操作的資源的地址,即相對于 http://localhost:8080/ctx/a/b,其路徑為 http://localhost:8080/ctx/a,因此,轉發后的資源的地址為 http://localhost:8080/ctx/a/x/y!如果由資源 /ctx/a/b 轉發到 /ctx/a/c,由于這兩個資源所處的路徑相同,我們當然可以這樣寫:getRequestDispatcher("c")
????綜上所述,不建議使用相對路徑來轉發資源。盡量使用絕對地址來轉發資源,同時,不要在資源的前面又畫蛇添足的加上 request.getContextPath(),因為轉發操作本來就是在同一個應用程序之間來處理的!
????重定向,不僅可以重定向到當前應用程序(http://localhost:8080/ctx)中的其它資源,還可以重定向到同一個站點上的其它應用程序(http://localhost:8080/another)中的資源,甚至是使用絕對 URL 重定向到其它站點的資源。
????被重定向的資源若是以 "/" 開頭,如 /x/y,實際上是相對于主機而言的,即完整的資源路徑為 http://localhost:8080/x/y,這并不是我們想要的資源。
????被重定向的資源若不是以 "/" 開頭,如 x/y,實際上是相對于做重定向操作的資源(http://localhost:8080/ctx/a/b)而言的,即完整的資源路徑為 /
????http://localhost:8080/ctx/a/x/y,這也不是我們想要的資源。當然,使用這種方式,我們重定向到 /ctx/a/c,即 sendRedict("c") 當然是沒問題的。
????使用絕對 URL 還可以將資源重定向到其它站點的資源。
????綜上所述,做重定向操作時,若想重定向同一個應用程序的其它資源時,同樣不推薦使用相對路徑,盡量使用絕對路徑,同時,務必在資源前面加上 request.getContextPath()。
????一句話總結:創建 RequestDispatcher 對象時指定的 URL 以“/”開頭,它是相對于當前 WEB 應用程序的根目錄;HttpServletResponse.sendRedirect 方法的 URL 以“/”開頭,它是相對于整個 WEB 站點的根目錄。
轉載于:https://my.oschina.net/abian/blog/127790
總結
以上是生活随笔為你收集整理的java web 中的转发和重定向路径问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到坐在棺材上是什么意思
- 下一篇: [你必须知道的异步编程]——异步编程模型