java web 中的轉發和重定向路徑問題

    假設應用程序的 contextPath 爲 /ctx,在 http://localhost:8080/ctx/a/b 資源中,咱們轉發和重定向到 http://localhost:8080/ctx/x/y 資源,分別應該怎麼寫? spa

    轉發,是在同一個應用程序中,請求從由資源 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") get

    綜上所述,不建議使用相對路徑來轉發資源。儘可能使用絕對地址來轉發資源,同時,不要在資源的前面又多此一舉的加上 request.getContextPath(),由於轉發操做原本就是在同一個應用程序之間來處理的! request

    重定向,不只能夠重定向到當前應用程序(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 站點的根目錄。

相關文章
相關標籤/搜索