久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

forward和redirect的區(qū)別

 昵稱emUPk81y 2014-01-16

1.從地址欄顯示來(lái)說(shuō) 
forward是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問(wèn)目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過(guò)來(lái),然后把這些內(nèi)容再發(fā)給瀏覽器.瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來(lái)的,所以它的地址欄還是原來(lái)的地址.
redirect是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址.所以地址欄顯示的是新的URL.

2.從數(shù)據(jù)共享來(lái)說(shuō) 
forward:轉(zhuǎn)發(fā)頁(yè)面和轉(zhuǎn)發(fā)到的頁(yè)面可以共享request里面的數(shù)據(jù).
redirect:不能共享數(shù)據(jù).

3.從運(yùn)用地方來(lái)說(shuō) 
forward:一般用于用戶登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊.
redirect:一般用于用戶注銷登陸時(shí)返回主頁(yè)面和跳轉(zhuǎn)到其它的網(wǎng)站等.

4.從效率來(lái)說(shuō) 
forward:高.
redirect:低.

本質(zhì)區(qū)別


解釋一   

一句話,,轉(zhuǎn)發(fā)是服務(wù)器行為,,重定向是客戶端行為,。為什么這樣說(shuō)呢,,這就要看兩個(gè)動(dòng)作的工作流程: 

轉(zhuǎn)發(fā)過(guò)程:客戶瀏覽器發(fā)送http請(qǐng)求----》web服務(wù)器接受此請(qǐng)求--》調(diào)用內(nèi)部的一個(gè)方法在容器內(nèi)部完成請(qǐng)求處理和轉(zhuǎn)發(fā)動(dòng)作----》將目標(biāo)資源 發(fā)送給客戶,;在這里,,轉(zhuǎn)發(fā)的路徑必須是同一個(gè)web容器下的url,,其不能轉(zhuǎn)向到其他的web路徑上去,中間傳遞的是自己的容器內(nèi)的request,。在客 戶瀏覽器路徑欄顯示的仍然是其第一次訪問(wèn)的路徑,,也就是說(shuō)客戶是感覺(jué)不到服務(wù)器做了轉(zhuǎn)發(fā)的。轉(zhuǎn)發(fā)行為是瀏覽器只做了一次訪問(wèn)請(qǐng)求,。 

重定向過(guò)程:客戶瀏覽器發(fā)送http請(qǐng)求----》web服務(wù)器接受后發(fā)送302狀態(tài)碼響應(yīng)及對(duì)應(yīng)新的location給客戶瀏覽器--》客戶瀏覽器發(fā)現(xiàn) 是302響應(yīng),,則自動(dòng)再發(fā)送一個(gè)新的http請(qǐng)求,請(qǐng)求url是新的location地址----》服務(wù)器根據(jù)此請(qǐng)求尋找資源并發(fā)送給客戶,。在這里 location可以重定向到任意URL,,既然是瀏覽器重新發(fā)出了請(qǐng)求,則就沒(méi)有什么request傳遞的概念了,。在客戶瀏覽器路徑欄顯示的是其重定向的 路徑,,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問(wèn)請(qǐng)求的,。 

解釋二 

重定向,,其實(shí)是兩次request, 
第一次,,客戶端request A,服務(wù)器響應(yīng),并response回來(lái),,告訴瀏覽器,,你應(yīng)該去B。這個(gè)時(shí)候IE可以看到地址變了,,而且歷史的回退按鈕也亮了,。重定向可以訪問(wèn)自己web應(yīng)用以外的資源。在重定向的過(guò)程中,,傳輸?shù)男畔?huì)被丟失,。 

例子: 


請(qǐng)求轉(zhuǎn)發(fā)是服務(wù)器內(nèi)部把對(duì)一個(gè)request/response的處理權(quán),移交給另外一個(gè) 
對(duì)于客戶端而言,,它只知道自己最早請(qǐng)求的那個(gè)A,,而不知道中間的B,甚至C,、D,。 傳輸?shù)男畔⒉粫?huì)丟失。 

例子: 

解釋三


假設(shè)你去辦理某個(gè)執(zhí)照,, 

重定向:你先去了A局,,A局的人說(shuō):“這個(gè)事情不歸我們管,去B局”,,然后,,你就從A退了出來(lái),自己乘車去了B局,。 

轉(zhuǎn)發(fā):你先去了A局,,A局看了以后,知道這個(gè)事情其實(shí)應(yīng)該B局來(lái)管,,但是他沒(méi)有把你退回來(lái),,而是讓你坐一會(huì)兒,自己到后面辦公室聯(lián)系了B的人,,讓他們辦好后,,送了過(guò)來(lái)。 

三,、請(qǐng)求重定向與請(qǐng)求轉(zhuǎn)發(fā)的比較 

盡管HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法都可以讓瀏覽器獲 得另外一個(gè)URL所指向的資源,,但兩者的內(nèi)部運(yùn)行機(jī)制有著很大的區(qū)別。下面是HttpServletResponse.sendRedirect方法實(shí)現(xiàn) 的請(qǐng)求重定向與RequestDispatcher.forward方法實(shí)現(xiàn)的請(qǐng)求轉(zhuǎn)發(fā)的總結(jié)比較: 

(1)RequestDispatcher.forward方法只能將請(qǐng)求轉(zhuǎn)發(fā)給同一個(gè)WEB應(yīng)用中的組件,;而 HttpServletResponse.sendRedirect 方法不僅可以重定向到當(dāng)前應(yīng)用程序中的其他資源,,還可以重定向到同一個(gè)站點(diǎn)上的其他應(yīng)用程序中的資源,甚至是使用絕對(duì)URL重定向到其他站點(diǎn)的資源。如果 傳遞給HttpServletResponse.sendRedirect 方法的相對(duì)URL以“/”開頭,,它是相對(duì)于整個(gè)WEB站點(diǎn)的根目錄,;如果創(chuàng)建RequestDispatcher對(duì)象時(shí)指定的相對(duì)URL以“/”開頭,它 是相對(duì)于當(dāng)前WEB應(yīng)用程序的根目錄,。 

(2)調(diào)用HttpServletResponse.sendRedirect方法重定向的訪問(wèn)過(guò)程結(jié)束后,,瀏覽器地址欄中顯示的URL會(huì)發(fā)生改變,由初 始的URL地址變成重定向的目標(biāo)URL,;而調(diào)用RequestDispatcher.forward 方法的請(qǐng)求轉(zhuǎn)發(fā)過(guò)程結(jié)束后,,瀏覽器地址欄保持初始的URL地址不變。 

(3)HttpServletResponse.sendRedirect方法對(duì)瀏覽器的請(qǐng)求直接作出響應(yīng),,響應(yīng)的結(jié)果就是告訴瀏覽器去重新發(fā)出對(duì)另外一 個(gè)URL的 訪問(wèn)請(qǐng)求,,這個(gè)過(guò)程好比有個(gè)綽號(hào)叫“瀏覽器”的人寫信找張三借錢,張三回信說(shuō)沒(méi)有錢,,讓“瀏覽器”去找李四借,并將李四現(xiàn)在的通信地址告訴給了“瀏覽 器”,。于是,,“瀏覽器”又按張三提供通信地址給李四寫信借錢,李四收到信后就把錢匯給了“瀏覽器”,??梢姡盀g覽器”一共發(fā)出了兩封信和收到了兩次回復(fù),, “瀏覽器”也知道他借到的錢出自李四之手,。RequestDispatcher.forward方 法在服務(wù)器端內(nèi)部將請(qǐng)求轉(zhuǎn)發(fā)給另外一個(gè)資源,瀏覽器只知道發(fā)出了請(qǐng)求并得到了響應(yīng)結(jié)果,,并不知道在服務(wù)器程序內(nèi)部發(fā)生了轉(zhuǎn)發(fā)行為,。這個(gè)過(guò)程好比綽號(hào)叫“瀏 覽器”的人寫信找張三借錢,張三沒(méi)有錢,,于是張三找李四借了一些錢,,甚至還可以加上自己的一些錢,然后再將這些錢匯給了“瀏覽器”,??梢姡盀g覽器”只發(fā) 出了一封信和收到了一次回復(fù),,他只知道從張三那里借到了錢,,并不知道有一部分錢出自李四之手。 

(4)RequestDispatcher.forward方法的調(diào)用者與被調(diào)用者之間共享相同的request對(duì)象和response對(duì)象,,它們屬于同 一個(gè)訪問(wèn)請(qǐng)求和響應(yīng)過(guò)程,;而HttpServletResponse.sendRedirect方法調(diào)用者與被調(diào)用者使用各自的request對(duì)象和 response對(duì)象,它們屬于兩個(gè)獨(dú)立的訪問(wèn)請(qǐng)求和響應(yīng)過(guò)程。對(duì)于同一個(gè)WEB應(yīng)用程序的內(nèi)部資源之間的跳轉(zhuǎn),,特別是跳轉(zhuǎn)之前要對(duì)請(qǐng)求進(jìn)行一些前期預(yù)處 理,,并要使用HttpServletRequest.setAttribute方法傳遞預(yù)處理結(jié)果,那就應(yīng)該使用 RequestDispatcher.forward方法,。不同WEB應(yīng)用程序之間的重定向,,特別是要重定向到另外一個(gè)WEB站點(diǎn)上的資源的情況,都應(yīng)該 使用HttpServletResponse.sendRedirect方法,。 

(5)無(wú)論是RequestDispatcher.forward方法,,還是HttpServletResponse.sendRedirect方法,在調(diào)用它們之前,,都不能有內(nèi)容已經(jīng)被實(shí)際輸出到了客戶端,。如果緩沖區(qū)中已經(jīng)有了一些內(nèi)容,這些內(nèi)容將被從緩沖區(qū)中清除,。



zend framework 中的應(yīng)用

控制這種分發(fā)過(guò)程的動(dòng)作控制器方法是_forward() ,;在任意的pre/postDispatch() 或者動(dòng)作中調(diào)用該方法,并傳入動(dòng)作,、控制器,、模塊、以及可選的附加參數(shù),,就可以進(jìn)入新的動(dòng)作,。

三種請(qǐng)求轉(zhuǎn)發(fā)得方式
public function fooAction() { 
 
// forward to another action in the current controller and module:
 $this->_forward('bar', null, null, array('baz' => 'bogus')); 
} 
 
public function barAction() {
 
// forward to an action in another controller: 
// FooController::bazAction(), 
// in the current module: 
$this->_forward('baz', 'foo', null, array('baz' => 'bogus')); 
} 
 
public function bazAction() {
 
// forward to an action in another controller in another module, 
// Foo_BarController::bazAction(): 
$this->_forward('baz', 'bar', 'foo', array('baz' => 'bogus')); 
}

頁(yè)面跳轉(zhuǎn)得方法是

$this->_redirect('/login/add');

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多