1. 程式人生 > >深入理解Servlet轉發和重定向

深入理解Servlet轉發和重定向

一、轉發

    轉發的原理,可以通過下圖展示:

    瀏覽器的請求傳送給元件1,元件1經過一些處理之後,將request和response物件“傳遞”給元件2,由元件2繼續處理,然後輸出響應(當然,也可以繼續向其他元件“傳遞”),這個傳遞的過程稱之為“轉發”。整個過程只涉及一次瀏覽器和伺服器之間的“請求-響應”,轉發過程中的元件共享同一個請求(request)和響應(response)物件。

    轉發的意義在於可以實現元件的“分工”。在基於MVC,多層結構的Web應用中,經常需要多個元件協同完成一次“請求-響應”工作,例如:使用者要獲取“裝置列表資訊”,提交請求至控制器元件(Servlet),該Servlet呼叫適當的JavaBean獲取了“裝置列表”資料然後再轉發至JSP元件去顯示資訊。

   RequestDispatcher物件封裝了轉發操作。通過request的getRequestDispatcher(String path)方法獲得RequestDispatcher物件,其中String型別引數path表示要轉發到的地址。呼叫Dispacther物件的forward(request, response)方法實現轉發。關於轉發的具體操作,有如下幾點需要注意:

1、轉發只能在同一個應用的元件之間進行,不可以轉發給其他應用的地址。

2、轉發的地址可以用“相對地址”方式,也可以用“絕對地址”方式。但需要注意的是:用絕對地址方式時,應從應用名後(Context path)開始。例如:要轉發到的地址為:

http://192.168.5.100/tst/jsp/somewhere.jsp (其中tst為應用名),對應的絕對地址為:“/jsp/somewhere.jsp”。這是很好理解的,因為轉發只能轉到本應用內的地址,所以絕對地址是沒有必要包含應用名的。

3、元件之間通過轉發來分工協作,勢必涉及資料的傳遞,可以通過request物件傳遞資料。request物件的setAttribute和getAttribute分別用於以“名稱-物件對”的形式存取資料。

4、在一個元件轉發給另外一個元件之前,通過response輸出的響應內容是沒有意義的。在轉發之前的通過out物件輸出的內容最終不會輸出到瀏覽器,這是由於RequestDispatcher在轉發之前清空了輸出緩衝區。但如果在轉發之前輸出的資訊超出了緩衝區,或者呼叫了out物件的flush()方法,此響應內容已經輸出到了客戶端(稱之為響應資訊已提交),此時如果實施轉發操作會丟擲執行時異常:java.lang.IllegalStateException。

二、重定向

重定向的含義可以由下圖說明:

    瀏覽器向某元件發出請求資訊,元件向瀏覽器發回一個重定向響應資訊,該響應資訊不包含具體的資料內容,只是在響應頭資訊中包含了需要重定向到的地址資訊,該地址可以是任何有效的URL。瀏覽器收到該重定向響應後會自動的向響應資訊頭中所指示的地址發出請求。整個重定向的過程涉及兩次“請求-響應”。具體的重定向響應格式如下所示:

HTTP/1.1302 Moved Temporarily

Server: Apache-Coyote/1.1

Content-Length: 0

Date: Mon, 30 Jun 2008 03:52:54 GMT

注意:重定向響應中包含重定向地址的部分。

重定向可以通過response的sendRedirect(String url)方法來實現,注意String型別的引數url表示重定向到的地址,需要注意的是,如果表示重定向到本應用內的一個絕對地址時,要從應用名前開始,例如:tst應用中的某個元件要重定向到本應用內的/jsp/somewhere.jsp,則重定向的絕對地址應該是:“/tst/jsp/somewhere.jsp”這一點和轉發中的絕對地址表示是不同的。

關於重定向的具體操作,有如下幾點需要注意:
1、使用response.sendRedirect時,前面不能有HTML輸出。
這並不是絕對的,不能有HTML輸出其實是指不能有HTML被送到了瀏覽器。事實上現在的server都有cache機制,一般在8K(我是說JSP SERVER),這就意味著,除非你關閉了cache,或者你使用了out.flush()強制重新整理,那麼在使用sendRedirect之前,有少量的HTML輸出也是允許的。
2、.response.sendRedirect之後,應該緊跟一句return;
我們已經知道response.sendRedirect是通過瀏覽器來做轉向的,所以只有在頁面處理完成後,才會有實際的動作。既然你已經要做轉向了,那麼後的輸出還有什麼意義呢?而且有可能會因為後面的輸出導致轉向失敗。

三、本質區別

一句話,轉發是伺服器行為,重定向是客戶端行為。為什麼這樣說呢,這就要看兩個動作的工作流程:

轉發過程:客戶瀏覽器傳送http請求----》web伺服器接受此請求--》呼叫內部的一個方法在容器內部完成請求處理和轉發動作----》將目標資源傳送給客戶;在這裡,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。

重定向過程:客戶瀏覽器傳送http請求----》web伺服器接受後傳送302狀態碼響應及對應新的location給客戶瀏覽器--》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址----》伺服器根據此請求尋找資源併發送給客戶。在這裡 location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什麼request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。

相關推薦

深入理解Servlet轉發定向

一、轉發     轉發的原理,可以通過下圖展示:     瀏覽器的請求傳送給元件1,元件1經過一些處理之後,將request和response物件“傳遞”給元件2,由元件2繼續處理,然後輸出響應(當然,也可以繼續向其他元件“傳遞”),這個傳遞的過程稱之為“轉發”。整

servlet轉發定向

strong 技術 過程 std 進行 logs font request java 1 轉發 RequestDispatcher getRequestDispatcher(java.lang.String path) 1)地址欄不會改變 2)轉發只能轉發到當前web應用內

jsp學習之——關於請求轉發定向的形象理解

本質 url 博文 客戶端 style 讓我 esp 方法 rect 1.重定向:是屬於客戶端行為,實現方法:response.sendRedirect() 從本質上講等同於兩次請求,前一次的請求對象不會保留,在瀏覽器上的直觀表現是——地址欄的URL地址會改變。 2.請求轉

JavaWeb(一)Servlet中亂碼解決與轉發定向的區別

這也 charset 都是 war 不一定 調用 技術 請求方式 註冊 前言   前面其實已經把Servlet中所有的內容都介紹完了,這篇講補充一點亂碼和重定向與轉發之間的區別! 一、request請求參數出現亂碼問題 1.1、get請求   1)亂碼示例   g

servlet學習(四)請求轉發定向

一、請求轉發和重定向兩者之間的區別 請求轉發:一次請求,位址列資訊不變。       重定向:兩次請求,位址列資訊會發生改變。 使用時機: 1.如果表單中有資料,而資料又比較重要,不能重複提交,建議使用重定向。 2.如果servlet接受後

servletJSP中轉發定向知識複習

1:servlet中轉發 、包含、和重定向 請求轉發:(源元件留頭不留體,目標元件留體不留頭) Servlet(源元件)先對客戶請求做一些預處理操作(一般是對響應頭進行處理),然後把請求轉發給其他Servlet(目標元件)來完成包括生成響應結果在內的後續操作。    實現方法:re

Servlet(五):請求轉發定向

請求轉發:   問題:    伺服器在接收到瀏覽器的請求後,僅僅使用一個 Servlet進行請求處理,會造成不同的Servlet邏輯程式碼 冗餘,Servlet的職責不明確。   解決:    使用請求轉發。  特點:    一次請求    位址列資訊不改變。   Request 物件作用域

Servlet跳轉到JSP頁面,轉發定向

web專案名為0809 轉發 request.getRequestDispatcher("/jsp/zhuanfa.jsp").forward(request, response); 重定向 response.sendRedirect("/0809/jsp/chong

Servlet基礎使用完成轉發定向

要知道servlet的使用需要了解servlet的工作基礎 什麼是servlet:sun公司制訂的一種用來擴充套件web伺服器功能的元件規範。 servlet之前是使用cgi(common gateway interface),收到請求會呼叫cgi,後面se

Servlet轉發定向的區別

response.sendredirect("http://www.foo.com/path/error.html"); 重定向和轉發有一個重要的不同:當使用轉發時,JSP容器將使用一個內部的方法來呼叫目標頁面,新的頁面繼續處理同一個請求,而瀏覽器將不會知道這個過程。 與之相反,重定向方式的含義是第一個頁面

Struts2理解——轉發定向

 轉發和重定向設定:         <action name="deptAction" class="com.syaccp.erp.action.DeptAction">             <result name="success">

Servlet中Request請求轉發定向遇到的亂碼問題

已經把專案的文字編碼格式改成了utf-8,但還是在轉發的時候遇到亂碼。 先把我的程式碼拷上來 package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.

Servlet轉發定向的區別

邏輯 jsp 一個 地址 span 目標 主頁 servlet status 應該是出自github上的項目JavaGuide 轉發是服務器行為,重定向是客戶端行為。轉發(Forword) 通過RequestDispatcher對象的forward(HttpServl

javaweb之Servlet,http協議以及請求轉發定向

本文是作者原創,版權歸作者所有.若要轉載,請註明出處. 一直用的框架開發,快連Servlet都忘了,此文旨在幫自己和大家回憶一下Servlet主要知識點.話不多說開始吧   用idea構建Servlet專案   專案結構如下      什麼是 Servle

SpringMVC核心技術---轉發定向

mvc 定向 return span attr pre DDU color redirect @Controller public class Mycontroller { //轉發 @RequestMapping("/adduser") publ

servlet轉發定向

服務 響應 瀏覽器 etc tco cap rect mil 頁面   HttpServletRequest:   表示瀏覽器向服務器發送的請求報文,由Tomcat創建然後作為參數傳遞給我們doget,dopost方法。   功能:getParameter()獲取請求參數

SpringMVC筆記(六)SpringMVC的轉發定向

配置文件 turn 返回 請求 字符串類型 情況 spring 讓我 ota 一、轉發和重定向 一般情況下,控制器方法返回字符串類型的值會被當成邏輯視圖名處理 如果返回的字符串中帶 forward: 或 redirect: 前綴 時,SpringMVC 會對他們進行特殊處理

轉發定向的區別

角色 行為 轉發 裏來 for 根據 邏輯 目標地址 一個 forward(轉發): 是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪裏來的,因為這個跳轉過程實在服務器實現的,

JSP轉發定向的區別

div mage alt send p s 分享圖片 ima 一次 nbsp 重定向: response.sendRedirect("地址"); a. 頁面地址顯示最終頁面 b. 不可向後傳遞參數 c. 跳到外部站點 轉

轉發定向

pan 瀏覽器 parameter Coding 重定向 style req app_id 請求 jsp或Servlet都會用到頁面跳轉,可以用request.getRequestDispatcher("p3.jsp").forward(request,respon