用戶向服務器發送了一次HTTP請求,該請求肯能會通過多個信息資源處理之後才返回給用戶,各個信息資源使用請求轉發機制相互轉發請求,可是用戶是感受不到請求轉發的。根據轉發方式的不一樣,能夠區分爲直接請求轉發(Forward)和間接請求轉發(Redirect)兩種有何區別呢?本篇在回答該問題的同時全面的講解兩種請求轉發方式的原理和區別。java
【關鍵考點】瀏覽器
【考題分析】服務器
Forward和Redirect表明了兩種請求轉發方式:直接轉發和間接轉發。url
直接轉發方式(Forward),客戶端和瀏覽器只發出一次請求,Servlet、HTML、JSP或其它信息資源,由第二個信息資源響應該請求,在請求對象request中,保存的對象對於一個每一個信息資源是共享的。spa
間接轉發方式(Redirect)實際是兩次HTTP請求,服務器端在響應第一次請求的時候,讓瀏覽器再向另一個URL發出請求,從而達到轉發的目的。3d
最明顯的區別就是:
redirect() 會丟失request的全部信息 它屬於頁面級的重定向,僅僅讓你的瀏覽器從新訪問一個新的url,做爲瀏覽者,能很明顯的看到瀏覽器url地址的變化,這和點擊了一個普通的超連接的後果是同樣的。
而 RequestDispatcher 的forward() 方法,是轉發,須要request 和 response最爲參數,就是將用戶的請求,連同請求信息等內容,一塊兒轉發到服務器的另一個servlet去處理,它不會丟失request信息。這一過程是服務器內部完成的,做爲訪問者,是感受不到了,或者說是透明的,所以訪客瀏覽器的url 是不會發生變化的。對象
舉個通俗的例子:blog
直接轉發就至關於:「A找B借錢,B說沒有,B去找C借,借到借不到都會把消息傳遞給A」;接口
下面詳細闡述一下二者的原理:資源
間接轉發方式,有時也叫重定向,它通常用於避免用戶的非正常訪問。例如:用戶在沒有登陸的狀況下訪問後臺資源,Servlet能夠將該HTTP請求重定向到登陸頁面,讓用戶登陸之後再訪問。在Servlet中,經過調用response對象的SendRedirect()方法,告訴瀏覽器重定向訪問指定的URL,示例代碼以下:
...... //Servlet中處理get請求的方法 public void doGet(HttpServletRequest request,HttpServletResponse response){ //請求重定向到另外的資源 response.sendRedirect("資源的URL"); } ........
上圖所示的間接轉發請求的過程以下:
直接轉發方式用的更多一些,通常說的請求轉發指的就是直接轉發方式。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); }......
上圖所示的直接轉發請求的過程以下:
技巧: 其實,經過瀏覽器就能夠觀察到服務器端使用了那種請求轉發方式,當單機某一個超連接時,瀏覽器的地址欄會出現當前請求的地址,若是服務器端響應完成之後,發現地址欄的地址變了,則證實是間接的請求轉發。相反,若是地址沒有發生變化,則表明的是直接請求轉發或者沒有轉發。
答:Forward和Redirect表明了兩種請求轉發方式:直接轉發和間接轉發。對應到代碼裏,分別是RequestDispatcher類的forward()方法和HttpServletRequest類的sendRedirect()方法。
對於間接方式,服務器端在響應第一次請求的時候,讓瀏覽器再向另一個URL發出請求,從而達到轉發的目的。它本質上是兩次HTTP請求,對應兩個request對象。
對於直接方式,客戶端瀏覽器只發出一次請求,Servlet把請求轉發給Servlet、HTML、JSP或其它信息資源,由第2個信息資源響應該請求,兩個信息資源共享同一個request對象。