轉發與重定向是入門JavaWeb的一個知識點,也是許多面試JAVA的后台所會遇到的一道面試題,許多的視頻教程對於轉發與重定向的理解並不透徹。
在這里跟我一起探究轉發與重定向的魅力吧。
用戶向服務器發送Http請求,作為用戶沒辦法直觀感受到請求轉發的存在,但是我們的數據都是經過請求轉發之后才能到達用戶端的。
我們腦子里先記住一個概念:轉發(forward)=直接請求轉發(forward)、重定向(redirect)=間接請求轉發(redirect)
然后我舉一個我看到最直觀地例子帶着大家入門一下:
直接轉發相當於:“A找B借錢,B說沒有,B去找C借,借到借不到都會把消息跟A說”
間接轉發相當於:“A找B借錢,B說沒有,讓A去找C借”,但是A不會跟B說A借到了。
上面的例子通俗易懂可以理解了吧
接下來用專業的術語
直接轉發方式:
客戶端和瀏覽器只發出一次請求,Servlet,HTML,JSP或其他的信息資源,由第二個信息資源響應該請求,在請求對象request中,保存的對象對於每個信息資源是共享的。
直接轉發方式用的更多一些,是用控制器來控制請求應該轉發給哪個信息資源,然后由這些信息資源處理請求,處理完以后還以為轉發給另外的信息資源來返回給用戶,這個過程就是典型的MVC模式。
代碼:
//Servlet里處理get請求的方法
public void doGet(HttpServletRequest request , HttpServletResponse response){
//獲取請求轉發器對象,該轉發器的指向通過getRequestDisPatcher()的參數設置
RequestDispatcher requestDispatcher =request.getRequestDispatcher("資源的URL");
//調用forward()方法,轉發請求
requestDispatcher.forward(request,response);
}

間接請求轉發(重定向):
實際上是兩次的HTTP請求,服務器在響應第一次請求的時候,讓瀏覽器再想另外一個URL發出請求,從而達到轉發的目的。一般用來避免用戶的非正常訪問。
代碼:
......
//Servlet中處理get請求的方法
public void doGet(HttpServletRequest request,HttpServletResponse response){
//請求重定向到另外的資源
response.sendRedirect("資源的URL");
}
........

總結一句話:轉發是服務器行為,重定向是客戶端行為。
轉發過程:客戶瀏覽器發送http請求--àweb服務器接受此請求--》調用內部的一個方法在容器內部完成請求處理和轉發動作----》將目標資源發送給客戶;在這里,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。
重定向過程:客戶瀏覽器發送http請求--àweb服務器接受后發送302狀態碼響應及對應新的location給客戶瀏覽器--》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址----》服務器根據此請求尋找資源並發送給客戶。在這里location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。
