小博老師解析經典Java面試題-redirect和forward的區別

[面試原題]java

簡述java中redirect和forward的區別。面試

[正確答案]瀏覽器

redirect是url重定向,讓客戶端從新發送一次請求到另外一個url。所以整個過程客戶端向服務器發送了兩次請求,而且客戶端瀏覽器地址欄中顯示新的url。服務器

forward是服務器轉發,客戶端只向服務器發送一次請求,而服務器在內部作了轉交處理,客戶端並不知情。所以客戶端瀏覽器地址欄中顯示的是前一次的url。app

[面試技術點]url

JavaEE中會話的概念知識。spa

[小博老師解讀]code

首先咱們在項目中新建兩個Servlet,BWF01Servlet映射BWF01,BWF02Servlet映射BWF02。核心代碼以下:對象

圖 1-1 BWF01Servlet映射的URL是BWF01get

圖 1-2 BWF02Servlet映射的URL是BWF02

如今咱們經過瀏覽器來訪問BWF01,而且但願自動跳轉到BWF02。咱們先使用redirect(跳轉)的方式來實現,咱們在BWF01Servlet最後增長一條指令:response.sendRedirect("BWF02");

瀏覽器訪問BWF01後,看到的結果以下:

咱們會看到,頁面顯示的內容是BWF02Servlet中的內容,瀏覽器地址欄中訪問的也是BWF02。其實在這個過程當中,客戶端向瀏覽器發送了兩次請求,第一次請求:客戶端向服務器請求BWF01,BWF01Servlet執行後,response.sendRedirect("BWF02");響應給客戶端,讓客戶端URL重定向到BWF02,此時客戶端發送第二次請求到BWF02。

咱們再使用forward(服務器轉定向)的方式來實現,咱們在BWF01Servlet中,把剛纔新增的response.sendRedirect("BWF02");修改爲:request.getRequestDispatcher("BWF02").forward(request, response);瀏覽器訪問BWF01後,看到的結果以下:

咱們發現,顯示的結果依然是BWF02Servlet中的內容,區別在於瀏覽器地址欄中請求的是BWF02而不是BWF01,這是由於在這個過程當中,客戶端只向服務器發送了一次請求,請求的URL是BWF01,而後BWF01Servlet運行後request.getRequestDispatcher("BWF02").forward(request, response);請求對象Request經過攔截配置信息找到了BWF02這個URL Mapping對應的Servlet(BWF02Servlet),將當前請求的處理任務轉交(forward)給了BWF02Servlet,而且將當前請求的Request和Response對象做爲傳輸傳給了BWF02Servlet。所以處理當前此次請求的真正Servlet是BWF02Servlet,可是這個轉交動做是在服務器完成的,客戶端全然不知。

相關文章
相關標籤/搜索