您好,登錄后才能下訂單哦!
前言
當(dāng)用戶向服務(wù)器發(fā)送了一次HTTP請(qǐng)求,該請(qǐng)求可能會(huì)經(jīng)過(guò)多個(gè)信息資源處理以后才返回給用戶,各個(gè)信息資源使用請(qǐng)求轉(zhuǎn)發(fā)機(jī)制相互轉(zhuǎn)發(fā)請(qǐng)求,但是用戶是感覺不到請(qǐng)求轉(zhuǎn)發(fā)的。根據(jù)轉(zhuǎn)發(fā)方式的不同,可以區(qū)分為直接請(qǐng)求轉(zhuǎn)發(fā)(Forward)和間接請(qǐng)求轉(zhuǎn)發(fā)(Redirect),那么這兩種轉(zhuǎn)發(fā)方式有何區(qū)別呢?本篇在回答該問(wèn)題的同時(shí)全面的講解兩種請(qǐng)求轉(zhuǎn)發(fā)方式的原理和區(qū)別。
【關(guān)鍵考點(diǎn)】
•請(qǐng)求轉(zhuǎn)發(fā)的含義;
•Forward轉(zhuǎn)發(fā)請(qǐng)求的原理;
•Redirect轉(zhuǎn)發(fā)請(qǐng)求的原理。
【考題分析】
Forward和Redirect代表了兩種請(qǐng)求轉(zhuǎn)發(fā)方式:直接轉(zhuǎn)發(fā)和間接轉(zhuǎn)發(fā)。
直接轉(zhuǎn)發(fā)方式(Forward),客戶端和瀏覽器只發(fā)出一次請(qǐng)求,Servlet、HTML、JSP或其它信息資源,由第二個(gè)信息資源響應(yīng)該請(qǐng)求,在請(qǐng)求對(duì)象request中,保存的對(duì)象對(duì)于每個(gè)信息資源是共享的。
間接轉(zhuǎn)發(fā)方式(Redirect)實(shí)際是兩次HTTP請(qǐng)求,服務(wù)器端在響應(yīng)第一次請(qǐng)求的時(shí)候,讓瀏覽器再向另外一個(gè)URL發(fā)出請(qǐng)求,從而達(dá)到轉(zhuǎn)發(fā)的目的。
舉個(gè)通俗的例子:
直接轉(zhuǎn)發(fā)就相當(dāng)于:“A找B借錢,B說(shuō)沒(méi)有,B去找C借,借到借不到都會(huì)把消息傳遞給A”;
間接轉(zhuǎn)發(fā)就相當(dāng)于:"A找B借錢,B說(shuō)沒(méi)有,讓A去找C借"。
下面詳細(xì)闡述一下兩者的原理:
一:間接請(qǐng)求轉(zhuǎn)發(fā)(Redirect)
間接轉(zhuǎn)發(fā)方式,有時(shí)也叫重定向,它一般用于避免用戶的非正常訪問(wèn)。例如:用戶在沒(méi)有登錄的情況下訪問(wèn)后臺(tái)資源,Servlet可以將該HTTP請(qǐng)求重定向到登錄頁(yè)面,讓用戶登錄以后再訪問(wèn)。在Servlet中,通過(guò)調(diào)用response對(duì)象的SendRedirect()方法,告訴瀏覽器重定向訪問(wèn)指定的URL,示例代碼如下:
...... //Servlet中處理get請(qǐng)求的方法 public void doGet(HttpServletRequest request,HttpServletResponse response){ //請(qǐng)求重定向到另外的資源 response.sendRedirect("資源的URL"); } ........
上圖所示的間接轉(zhuǎn)發(fā)請(qǐng)求的過(guò)程如下:
1.瀏覽器向Servlet1發(fā)出訪問(wèn)請(qǐng)求;
2.Servlet1調(diào)用sendRedirect()
方法,將瀏覽器重定向到Servlet2;
3.瀏覽器向servlet2發(fā)出請(qǐng)求;
4.最終由Servlet2做出響應(yīng)。
二:直接請(qǐng)求轉(zhuǎn)發(fā)(Forward)
直接轉(zhuǎn)發(fā)方式用的更多一些,一般說(shuō)的請(qǐng)求轉(zhuǎn)發(fā)指的就是直接轉(zhuǎn)發(fā)方式。Web應(yīng)用程序大多會(huì)有一個(gè)控制器。由控制器來(lái)控制請(qǐng)求應(yīng)該轉(zhuǎn)發(fā)給那個(gè)信息資源。然后由這些信息資源處理請(qǐng)求,處理完以后還可能轉(zhuǎn)發(fā)給另外的信息資源來(lái)返回給用戶,這個(gè)過(guò)程就是經(jīng)典的MVC模式。
javax.serlvet.RequestDispatcher
接口是請(qǐng)求轉(zhuǎn)發(fā)器必須實(shí)現(xiàn)的接口,由Web容器為Servlet提供實(shí)現(xiàn)該接口的對(duì)象,通過(guò)調(diào)用該接口的forward()
方法到達(dá)請(qǐng)求轉(zhuǎn)發(fā)的目的,示例代碼如下:
...... //Servlet里處理get請(qǐng)求的方法 public void doGet(HttpServletRequest request , HttpServletResponse response){ //獲取請(qǐng)求轉(zhuǎn)發(fā)器對(duì)象,該轉(zhuǎn)發(fā)器的指向通過(guò)getRequestDisPatcher()的參數(shù)設(shè)置 RequestDispatcher requestDispatcher =request.getRequestDispatcher("資源的URL"); //調(diào)用forward()方法,轉(zhuǎn)發(fā)請(qǐng)求 requestDispatcher.forward(request,response); } ......
上圖所示的直接轉(zhuǎn)發(fā)請(qǐng)求的過(guò)程如下:
1.瀏覽器向Servlet1發(fā)出訪問(wèn)請(qǐng)求;
2.Servlet1調(diào)用forward()
方法,在服務(wù)器端將請(qǐng)求轉(zhuǎn)發(fā)給Servlet2;
3.最終由Servlet2做出響應(yīng)。
技巧:其實(shí),通過(guò)瀏覽器就可以觀察到服務(wù)器端使用了那種請(qǐng)求轉(zhuǎn)發(fā)方式,當(dāng)單擊某一個(gè)超鏈接時(shí),瀏覽器的地址欄會(huì)出現(xiàn)當(dāng)前請(qǐng)求的地址,如果服務(wù)器端響應(yīng)完成以后,發(fā)現(xiàn)地址欄的地址變了,則證明是間接的請(qǐng)求轉(zhuǎn)發(fā)。相反,如果地址沒(méi)有發(fā)生變化,則代表的是直接請(qǐng)求轉(zhuǎn)發(fā)或者沒(méi)有轉(zhuǎn)發(fā)。
問(wèn):直接轉(zhuǎn)發(fā)和間接轉(zhuǎn)發(fā)的原理及區(qū)別是什么?
答:Forward和Redirect代表了兩種請(qǐng)求轉(zhuǎn)發(fā)方式:直接轉(zhuǎn)發(fā)和間接轉(zhuǎn)發(fā)。對(duì)應(yīng)到代碼里,分別是RequestDispatcher類的forward()
方法和HttpServletRequest類的sendRedirect()
方法。
對(duì)于間接方式,服務(wù)器端在響應(yīng)第一次請(qǐng)求的時(shí)候,讓瀏覽器再向另外一個(gè)URL發(fā)出請(qǐng)求,從而達(dá)到轉(zhuǎn)發(fā)的目的。它本質(zhì)上是兩次HTTP請(qǐng)求,對(duì)應(yīng)兩個(gè)request對(duì)象。
對(duì)于直接方式,客戶端瀏覽器只發(fā)出一次請(qǐng)求,Servlet把請(qǐng)求轉(zhuǎn)發(fā)給Servlet、HTML、JSP或其它信息資源,由第2個(gè)信息資源響應(yīng)該請(qǐng)求,兩個(gè)信息資源共享同一個(gè)request對(duì)象。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)億速云的支持。最后,祝大家都能找到一個(gè)稱心滿意的工作!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。