Java中重定向與請求轉發的區別

比喻:
請求轉發:A向B發送請求,想讓B幫忙完成一項工作,當B接收到請求後發現自己完成不了,於是B請C幫忙,C接收到B的請求後最終完成了該項工作,並把最後的結果返回給A。此過程A只發送了一次請求給B,A只知道把請求發給B,至於B是怎麼完成的A並不關心,他只等待最終的結果。
重定向:A向B發送請求,想讓B幫忙完成一項工作,當B接收到請求後發現自己無法完成,就立即告訴A情況,並向A推薦C可以完成該項工作,於是A就找C幫忙,C最終完成該項工作,返回給A。

不同點:
1、瀏覽器地址欄顯示不同(表面區別):
無論進行多少次請求,如果使用請求轉發來實現,瀏覽器地址欄中只顯示第一次發送請求的地址;
如果使用重定向來實現,瀏覽器地址欄顯示的是每次請求的新地址。這只是表面上看到的不同地方。

2、組件之間可否共享信息不同(本質區別)
從本質上講,請求轉發時,從發送第一次到最後一次請求的過程中,WEB容器只**創建一次**request和response對象,請求之間始終共享這兩個對象,所以每個請求可以訪問他之前請求中的參數和屬性的值;
而重定向時,瀏覽器每發送一次請求,WEB容器都會重新創建新的request和response對象,所以請求之間不能共享信息,即不能在請求中訪問到他之前請求中的參數和屬性的值。

3、實現方式不同:
3.1 請求轉發的實現步驟:
1)說明將要轉發的資源;
2)獲取請求轉發的對象;
3) 調用請求轉發對象中forward()方法
Java代碼

 1). String forward = "/a.jsp"; 
 2). RequestDispatcher rd = request.getRequestDispatcher(forward);
 3). rd.forward(request, reponse); 

綜合:

request.getRequestDispatcher("/a.jsp").forward(request,response);

3.2 重定向的實現步驟:
1) 說明將要重定向的資源;
2) 調用response對象中sendRedirect方法
Java代碼

  1. String resource = request.geContextPath() + "/a.jsp"; 
  2. response.sendRedirect(resource);

綜合:

response.sendRediect(request.geContextPath() + "/a.jsp");

4、知情人不同
請求轉發的過程只有WEB服務器知道,而瀏覽器不知道進行了多少次轉發,以及都轉發給哪些組件(servlet,JSP),它只是在等待WEB服務器最終的結果。
而重定向時,每發送一次請求,WEB服務器都會通知瀏覽器的,所以重定向了幾次請求以及每次都向哪個組件發送的請求,瀏覽器很清楚,當讓WEB服務器也很明白。

相同點: 兩者都可以進行多次請求的轉發。

總結:什麼情況下使用重定向,什麼情況下請求轉發,這個不是看我們的習慣,而是什麼情況下必須用什麼:
重定向:之前的request中存放的變量全部失效並進入一個新session的作用域;
請求轉發:之前的request中存放的變量沒有失效,就想把兩個頁面拼在一起

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章