JAVA面試題Forward和Redirect區別
1.從位址列顯示來說
forward是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道伺服器傳送的內容從哪裡來的,所以它的位址列還是原來的地址.
redirect是服務端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以位址列顯示的是新的URL.
2.從資料共享來說
forward:轉發頁面和轉發到的頁面可以共享request裡面的資料.
redirect:不能共享資料.
3.從運用地方來說
forward:一般用於使用者登陸的時候,根據角色轉發到相應的模組.
redirect:一般用於使用者登出登陸時返回主頁面和跳轉到其它的網站等.
4.從效率來說
forward:高.
redirect:低
undefined
如果你想學習Java可以來這個群,首先是二二零,中間是一四二,最後是九零六,裡面有大量的學習資料可以下載。
閱讀目錄
一:間接請求轉發(Redirect)
二:直接請求轉發(Forward)
使用者向伺服器傳送了一次HTTP請求,該請求可能會經過多個資訊資源處理以後才返回給使用者,各個資訊資源使用請求轉發機制相互轉發請求,但是使用者是感覺不到請求轉發的。根據轉發方式的不同,可以區分為直接請求轉發(Forward)和間接請求轉發(Redirect),那麼這兩種轉發方式有何區別呢?本篇在回答該問題的同時全面的講解兩種請求轉發方式的原理和區別。
【出現頻率】
【關鍵考點】
請求轉發的含義;
Forward轉發請求的原理;
Redirect轉發請求的原理。
【考題分析】
Forward和Redirect代表了兩種請求轉發方式:直接轉發和間接轉發。
直接轉發方式(Forward),客戶端和瀏覽器只發出一次請求,Servlet、HTML、JSP或其它資訊資源,由第二個資訊資源響應該請求,在請求物件request中,儲存的物件對於每個資訊資源是共享的。
間接轉發方式(Redirect)實際是兩次HTTP請求,伺服器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的。
舉個通俗的例子:
直接轉發就相當於:“A找B借錢,B說沒有,B去找C借,借到借不到都會把訊息傳遞給A”;
間接轉發就相當於:”A找B借錢,B說沒有,讓A去找C借”。
下面詳細闡述一下兩者的原理:
回到頂部
一:間接請求轉發(Redirect)
間接轉發方式,有時也叫重定向,它一般用於避免使用者的非正常訪問。例如:使用者在沒有登入的情況下訪問後臺資源,Servlet可以將該HTTP請求重定向到登入頁面,讓使用者登入以後再訪問。在Servlet中,通過呼叫response物件的SendRedirect()方法,告訴瀏覽器重定向訪問指定的URL,示例程式碼如下:
複製程式碼
……
//Servlet中處理get請求的方法
public void doGet(HttpServletRequest request,HttpServletResponse response){
//請求重定向到另外的資源
response.sendRedirect(“資源的URL”);
}
……..
上圖所示的間接轉發請求的過程如下:
瀏覽器向Servlet1發出訪問請求;
Servlet1呼叫sendRedirect()方法,將瀏覽器重定向到Servlet2;
瀏覽器向servlet2發出請求;
最終由Servlet2做出響應。
回到頂部
二:直接請求轉發(Forward)
直接轉發方式用的更多一些,一般說的請求轉發指的就是直接轉發方式。Web應用程式大多會有一個控制器。由控制器來控制請求應該轉發給那個資訊資源。然後由這些資訊資源處理請求,處理完以後還可能轉發給另外的資訊資源來返回給使用者,這個過程就是經典的MVC模式。
javax.serlvet.RequestDispatcher介面是請求轉發器必須實現的介面,由Web容器為Servlet提供實現該介面的物件,通過呼叫該介面的forward()方法到達請求轉發的目的,示例程式碼如下:
……
//Servlet裡處理get請求的方法
public void doGet(HttpServletRequest request , HttpServletResponse response){
//獲取請求轉發器物件,該轉發器的指向通過getRequestDisPatcher()的引數設定
RequestDispatcher requestDispatcher =request.getRequestDispatcher(“資源的URL”);
//呼叫forward()方法,轉發請求
requestDispatcher.forward(request,response);
}
……
上圖所示的直接轉發請求的過程如下:
瀏覽器向Servlet1發出訪問請求;
Servlet1呼叫forward()方法,在伺服器端將請求轉發給Servlet2;
最終由Servlet2做出響應。
技巧:其實,通過瀏覽器就可以觀察到伺服器端使用了那種請求轉發方式,當單擊某一個超連結時,瀏覽器的位址列會出現當前請求的地址,如果伺服器端響應完成以後,發現位址列的地址變了,則證明是間接的請求轉發。相反,如果地址沒有發生變化,則代表的是直接請求轉發或者沒有轉發。
問:直接轉發和間接轉發的原理及區別是什麼?
答:Forward和Redirect代表了兩種請求轉發方式:直接轉發和間接轉發。對應到程式碼裡,分別是RequestDispatcher類的forward()方法和HttpServletRequest類的sendRedirect()方法。
對於間接方式,伺服器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的。它本質上是兩次HTTP請求,對應兩個request物件。
對於直接方式,客戶端瀏覽器只發出一次請求,Servlet把請求轉發給Servlet、HTML、JSP或其它資訊資源,由第2個資訊資源響應該請求,兩個資訊資源共享同一個request物件。
相關文章
- Java經典面試題: == 和 equals( )的區別Java面試題
- Spring MVC之redirect、forward和普通跳轉SpringMVCForward
- Java面試題 equals()與"=="的區別?Java面試題
- Document Redirect 與 XHR Redirect區別
- 【Java面試】@Resource 和 @Autowired 的區別Java面試
- sendRedirect()和forward()方法的區別Forward
- iOS面試題-load 和 initlize的區別iOS面試題
- nginx面試題-nginx和apache的區別Nginx面試題Apache
- JAVA面試題 StringBuffer和StringBuilder的區別,從原始碼角度分析?Java面試題UI原始碼
- Java:面試題:抽象類與介面的區別Java面試題抽象
- 【Java面試題系列】:Java中final finally finalize的區別Java面試題
- 【Java面試】Spring中 BeanFactory和FactoryBean的區別Java面試SpringBean
- 【Java面試】IO和NIO有什麼區別?Java面試
- java面試題之Thread的run()和start()方法有什麼區別Java面試題thread
- .NET面試題(29) http和https的區別面試題HTTP
- 【Java面試】Mybatis中#{}和${}的區別是什麼?Java面試MyBatis
- 【面試題】array_merge 和 array+ 的區別面試題
- java基礎總結(面試高頻問題)十:java抽象類和介面的區別Java面試抽象
- 面試之 get 和 post 區別面試
- 面試題: Webpack 的 plugin 和 loader 有什麼區別面試題WebPlugin
- java面試一日一題:binlog undolog redolog的區別Java面試
- [面試專題]從for迴圈看let和var的區別面試
- 面試題:箭頭函式和普通函式的區別面試題函式
- Treasure Of JAVA——JAVA的資料型別(JAVA面試題)Java資料型別面試題
- 面試官:Java的重寫和過載有什麼區別?面試Java
- 面試題總結:Queue 中 poll()和 remove()有什麼區別?面試題REM
- get和post請求的區別(面試)面試
- #如何看待問“a = a + b和a += b有什麼區別”的Java面試官?Java面試
- java面試題Java面試題
- 【Java面試】Java常見IO面試題!Java面試題
- 【Java面試】Java設計模式面試題!Java設計模式面試題
- 面試題:VueRouter中的 hash 模式和 history 模式有什麼區別面試題Vue模式
- Java集合詳解4:一文讀懂HashMap和HashTable的區別以及常見面試題JavaHashMap面試題
- 100道JAVA面試題+JAVA面試題參考答案Java面試題
- 【對線面試官】CountDownLatch和CyclicBarrier的區別面試CountDownLatch
- GET 和 POST 的區別(重要,面試常問)面試
- 面試-陣列和連結串列的區別面試陣列
- 【Java面試題】Java面試之多執行緒!Java面試題執行緒
- 多執行緒面試題之sleep()和wait()方法有什麼區別?執行緒面試題AI