1.兩者區別
重定向是在客戶端發生的,URL地址欄變化,可以定向到任何服務器的資源;
轉發是發生在服務器內部的,瀏覽器地址欄不變化,只能轉發本服務器的資源。
2.使用方法
重定向使用:response.sendRedirect(url);
轉發時使用:request.getRequestDispatcher(url).forward(request,response);
3.禁用Cookie時,如何使用Session
session雖然是服務器端的,但是在瀏覽器再次訪問其他servlet時,服務器如何知道是否為同一客戶端?其實,在瀏覽器訪問session資源后,服務器會發送一個set-cookie響應,此cookie不是存在本地的,存在瀏覽器內部,所以說session是基於cookie的。但是當瀏覽器禁用所有cookie時,cookie存不進去,服務器如何分辨客戶機呢?
使用URL重寫,即將session產生的id設置在URL上,瀏覽器每次訪問,都帶着此后綴,所以無論是否禁用cookie,都能訪問同一session資源,方法如下:
重定向URL使用
String url = response.encodeRedirectURL(url);
response.sendRedirect(url);
非重定向URL使用
String url = response.encodeURL(url);
response.getRequestDispatcher(url).forward();
表單action和超鏈接也同樣適用
4.其他區別
a. RequestDispatcher.forward方法只能將請求轉發給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect 方法還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。
b. 如果傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對於整個WEB站點的根目錄;如果創建RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對於當前WEB應用程序的根目錄。
c. 調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束后,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重定向的目標URL;調用RequestDispatcher.forward 方法的請求轉發過程結束后,瀏覽器地址欄保持初始的URL地址不變。
d. HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;RequestDispatcher.forward方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在服務器程序內部發生了轉發行為。
e. RequestDispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬於兩個獨立的訪問請求和響應過程。
上文鏈接:
鏈接:https://www.jianshu.com/p/2464779932bd
筆者踩坑那些事——跳轉之url地址出問題,不同的轉發方式對應的相對地址可能不同,大家多踩踩坑!必踩坑。
----------------------------------------------------------------------------------------------------------------------
最后通過自己的經驗總結如下:
重定向
客戶端跳轉 加’/'會報錯 代表的是服務器根目錄 tomcat/webapps/ 代表這里面的內容
Servlet轉發
內部轉發 代表tomcat/webapps/項目
最佳方式:
轉發一律帶’/’
重定向 不帶’/’