sendRedirect()和forward()方法的區別
HttpServletResponse接口的sendRedirect()方法和RequestDispatcher接口的forward()方法都可以利用另外的資源(Servlet、JSP頁面或HTML文件)來為客戶端進行服務,但是這兩種方法有着本質上的區別。
下面分別給出sendRedirect()方法和forward()方法的工作原理圖:
交互過程如下:
1) 瀏覽器訪問Servlet1;
2) Servlet1想讓Servlet2為客戶端服務;
3) Servlet1調用sendRedirect()方法,將客戶端的請求重定向到Servlet2;
4) 瀏覽器訪問Servlet2;
5) Servlet2對客戶端的請求做出響應。
我們可以看出,調用sendRedirect()方法,實際上是告訴瀏覽器Servlet2所在的位置,讓瀏覽器重新訪問Servlet2。調用sendRedirect()方法,會在響應中設置Location響應報頭。要注意的是,這個過程對於用戶來說是透明的,瀏覽器會自動完成新的訪問。而瀏覽器地址欄顯示的URL是重定向之后的URL。
而forward()方法的交互過程如下:
1) 瀏覽器訪問Servlet1;
2) Servlet1想讓Servlet2對客戶端的請求進行響應,於是調用forward()方法,將請求轉發給Servlet2進行處理。
3) Servlet2對請求請出響應。
從上圖的交互過程可以看出,調用forward()方法,對瀏覽器來說是透明的,瀏覽器並不知道為其服務的Servlet已經換成Servlet2了,它只知道發出了一個請求,獲得了一個響應。而地址欄顯示的URL始終會是原始請求的URL。
此外,sendRedirect()方法和forward()方法還有一個區別,那就是sendRedirect()方法不但可以在位於同一主機上的不同Web應用程序之間進行重定向,而且可以將客戶端重定向到其他服務器上的Web應用程序資源。