【001】轉發與重定向區別


一、請求的兩種操作方式

在進行servlet+jsp簡單功能構建的時候發現在訪問jsp頁面時遇到這兩種操作方式:

1、req.getRequestDispatcher("jsp/index.jsp").forward(req, resp);

2、resp.sendRedirect("jsp/index.jsp");

這兩種方式瀏覽器在請求該servlet的時候都可以訪問到jsp頁面,但是他們的區別貌似這么長時間沒有接觸到servlet比較基礎的東西有些模糊了,通過網上搜索查看一些資料進行重新了解了一下。

req.getRequestDispatcher("jsp/index.jsp").forward(req, resp)方法叫做轉發(服務器行為由servlet直接將資源返回瀏覽器完成的),而resp.sendRedirect("jsp/index.jsp")方法叫做重定向(瀏覽器行為,由瀏覽器重新定位訪問對應資源的方式)

二、轉發與重定向的具體操作時序圖:

1、轉發:req.getRequestDispatcher("jsp/index.jsp").forward(req, resp),通過servlet的request內部請求訪問轉發的資源,由服務器進行操作,客戶端(瀏覽器)對服務器內部的轉發不感知。

 時序圖:

 操作演示:瀏覽器訪問通過轉發的方式響應時,瀏覽器的地址欄不會變更。

 

 

2、重定向:resp.sendRedirect("jsp/index.jsp"),通過response直接將資源路徑返回給瀏覽器,由瀏覽器重新發起對服務器的請求(這里資源路徑也可以是其他web站點的資源),也就是瀏覽器會對服務器進行兩次請求。

 

操作演示:進行重定向訪問時瀏覽器的地址欄的url會發生變化,變為第二次請求訪問的資源url

 三、轉發與重定向關於路徑的試探

1、轉發url相對路徑與絕對路徑的訪問結果:絕對路徑與相對路徑對服務器轉發來說無影響。(?)

使用相對路徑req.getRequestDispatcher("jsp/index.jsp").forward(req, resp);

使用絕對路徑req.getRequestDispatcher("/jsp/index.jsp").forward(req, resp);

2、重定向url相對路徑與絕對路徑的訪問結果:相對路徑訪問時以web站點項目路徑為前綴返回瀏覽器的,絕對路徑訪問時以web站點路徑為前綴訪問路徑的。

使用相對路徑resp.sendRedirect("jsp/index.jsp");

使用絕對路徑resp.sendRedirect("/jsp/index.jsp");

 四、轉發與重定向的特性總結:

通過時序圖可以比較出兩者的不同:

1、重定向時瀏覽器會發起兩次請求;轉發時瀏覽器只進行了一次請求。

2、重定向因為是兩次請求所以第一次的request與第二次請求的request是不一樣的,數據不可傳遞;轉發因為是servlet的行為,是服務器內部把對一個request/response的處理權,移交給另外一個處理程序,數據是可傳遞的。

3、重定向時servlet將資源url發送給客戶端,由客戶端進行重新請求,那么這個url可以是任意的資源請求url;轉發因為時servlet的服務器端操作的行為,所以只能轉發服務器的該web內站點資源url。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM