天天看點

關于求請轉發和重定向的路徑問題

請求轉發和重定向的路徑問題

請求轉發和重定向同作為web的頁面跳轉方式,其實有很大差異。

請求轉發的過程隻産生一個request請求,并且是在伺服器内部跳轉,跳轉到新頁面後URL也是保持第一次請求的URL;

重定向的過程産生了兩個request請求,第一個請求發出後伺服器即響應302狀态碼給浏覽器,通知浏覽器再去通路一個新的頁面,于是從用戶端發出第二條request請求,最終響應給使用者的也是新的URL了,是以重定向也叫作用戶端跳轉。

但我發現在servlet和SpringMVC中,請求轉發和重定向的路徑定義似乎不太一緻,故在此做出總結:

假設目前項目名為crm,通路項目下的index.jsp時路徑則為:Http://localhost:8080/crm/index.jsp.

一、Servlet中的路徑

假設此時項目的webapp下還有一個login.jsp,那麼通過請求轉發可寫為"request.getRequestDispatcher(’/login.jsp’).forward(req,resp)",其中斜杠/ 代表的是目前項目的根目錄,也就是…/crm,這種是通過帶斜杠來請求轉發的,不帶斜杠的應表示為"request.getRequestDispatcher(‘login.jsp’).forward(res,resp)",前面的路徑部分為目前頁面路徑的目錄去掉最後一個斜杠後的内容,并替換為此相對路徑内容。

通過重定向跳轉到login.jsp的帶斜杠寫法:“response.redirect(‘request.getContextPath()/login.jsp’)’”,也就是說,斜杠代表的是伺服器的根目錄,而不是項目的根目錄;不帶斜杠寫法“response.redirect(‘login.jsp’)’”,此時和請求轉發代表的意義相同。

二、SpringMVC中的路徑

此時通過請求轉發和重定向跳往login.jsp的帶斜杠方式都為“return:forward(/redirect):/login.jsp”,也就是說,斜杠/代表目前項目的根目錄

不帶斜杠的方式意義仍和上面一緻。