jsp中重新導向和轉寄的區別:
一:間接請求轉寄(Redirect) 二:直接請求轉寄(Forward)
使用者向伺服器發送了一次HTTP請求,該請求可能會經過多個資訊資源處理以後才返回給使用者,各個資訊資源使用請求轉寄機制相互轉寄請求,但是使用者是感覺不到請求轉寄的。根據轉寄方式的不同,可以區分為直接請求轉寄(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對象.
(一).重新導向和轉寄有一個重要的不同:1.當使用轉寄時,JSP容器將使用一個內部的方法來調用目標頁面,新的頁面繼續處理同一個請求,而瀏覽器將不會知道這個過程。 2.與之相反,重新導向方式的含義是第一個頁面通知瀏覽器發送一個新的頁面請求。因為,當你使用重新導向時,瀏覽器中所顯示的URL會變成新頁面的URL, 而當使用轉寄時,該URL會保持不變。重新導向的速度比轉寄慢,因為瀏覽器還得發出一個新的請求。同時,由於重新導向方式產生了一個新的請求,所以經過一次重新導向後,request內的對象將無法使用。(二).怎麼選擇是重新導向還是轉寄呢。通常情況下轉寄更快,而且能保持request內的對象,所以他是第一選擇。但是由於在轉寄之後,瀏覽器中URL仍然指向開始頁面,此時如果重載當前頁面,開始頁面將會被重新調用。如果你不想看到這樣的情況,則選擇轉寄。 (三).轉寄和重新導向的區別不要僅僅為了把變數傳到下一個頁面而使用session範圍,那會無故增大變數的範圍,轉寄也許可以協助你解決這個問題。重新導向:以前的request中存放的變數全部失效,並進入一個新的request範圍。轉寄:以前的request中存放的變數不會失效,就像把兩個頁面拼到了一起。
點擊開啟連結