JavaWeb中請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向的區(qū)別以及使用
什么是請(qǐng)求轉(zhuǎn)發(fā)?
請(qǐng)求轉(zhuǎn)發(fā)是指,服務(wù)器收到請(qǐng)求后,從一次資源跳轉(zhuǎn)到另一個(gè)資源的操作。
請(qǐng)求轉(zhuǎn)發(fā)的特點(diǎn)
1.瀏覽器地址欄不會(huì)發(fā)生變化
2.他們一次請(qǐng)求,服務(wù)器完成轉(zhuǎn)發(fā)操作
3.共享Request域中的數(shù)據(jù)
4.可以轉(zhuǎn)發(fā)到WEB-INF目錄下
5.不可以訪問工程以外的資源
舉個(gè)例子:
1.一個(gè)公司有多個(gè)部門,其中部門1(Servlet1)向客戶提供了自己能夠提供的服務(wù),但是還有一部分服務(wù)自己提供不了,需要其他部門的服務(wù);
2.所以部門1(Servlet1)將客戶的文件蓋一個(gè)章,證明部門1已經(jīng)提供了服務(wù),然后將其轉(zhuǎn)交(請(qǐng)求轉(zhuǎn)發(fā))到部門2(Servlet2);
3.部門2檢查部門1是否蓋過章了,如果蓋過章就繼續(xù)向客戶提供服務(wù)…;
4.直到所有服務(wù)都處理完,將客戶需要的數(shù)據(jù)提供給客戶(即,將數(shù)據(jù)轉(zhuǎn)發(fā)給客戶端**[轉(zhuǎn)發(fā)到某個(gè)頁面]**);
package servlet; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Servlet1 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.servlet1先獲取請(qǐng)求參數(shù),看看servlet1需要做的事 String username = request.getParameter("username"); System.out.println(username); //.....部門1提供自己的服務(wù) //2.servlet1設(shè)置一個(gè)參數(shù)證明servlet1轉(zhuǎn)發(fā)的請(qǐng)求(部門1蓋一個(gè)章) request.setAttribute("key1", "servlet1"); //3.查詢servlet2的路徑,(部門1將其轉(zhuǎn)交給部門1) RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2"); //4.把請(qǐng)求和響應(yīng)轉(zhuǎn)發(fā)給servlet2 dispatcher.forward(request, response); } }
package servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Servlet2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //部門2查看客戶需要的服務(wù) System.out.println("Servlet2查看參數(shù): "+request.getParameter("username")); //部門2查看部門1有沒有蓋章,判斷是否繼續(xù)服務(wù) System.out.println("Servlet2查看是否有Servlet1的證明: "+request.getAttribute("key1")); //部門2處理完自己的服務(wù), System.out.println("Servlet處理自己的業(yè)務(wù)"); } }
注意
1.這時(shí)候如果我們將Servlet2放在WEB_INF下,那么我們就無法直接訪問servlet2了;
2.但是我們可以通過請(qǐng)求轉(zhuǎn)發(fā)來實(shí)現(xiàn)訪問servlet2;
思考:登錄功能和這種請(qǐng)求轉(zhuǎn)發(fā)方法類似,我們無法跳過登錄界面直接訪問系統(tǒng),所有我們可以用這種請(qǐng)求轉(zhuǎn)發(fā)的方法來實(shí)現(xiàn);
什么是請(qǐng)求重定向?
請(qǐng)求重定向:是指客戶端發(fā)送請(qǐng)求,然后服務(wù)器告訴客戶端,我給你一個(gè)地址,你去新的地址訪問(之前的地址可能已經(jīng)被廢棄,或者之前的地址[Servlet]無法滿足需求);
第一種方案
// 設(shè)置響應(yīng)狀態(tài)碼 302 ,表示重定向,(已搬遷) resp.setStatus(302); // 設(shè)置響應(yīng)頭,說明 新的地址在哪里 resp.setHeader("Location", http://localhost:8080);
第二種方案(推薦使用)
resp.sendRedirect(http://localhost:8080);
請(qǐng)求重定向的特點(diǎn)
1.瀏覽器的地址欄會(huì)發(fā)生變化
2.瀏覽器發(fā)送了兩次請(qǐng)求,而不是像調(diào)用request的getRequestDispatcher("/a/b/c.html").forward(request, response)方法實(shí)現(xiàn)的;所以一共創(chuàng)建了兩個(gè)request對(duì)象
3.兩個(gè)request對(duì)象不能共享域數(shù)據(jù)
4.重定向不能訪問WEB-INF里的資源,因?yàn)閮纱握?qǐng)求都是客戶端發(fā)起的,客戶端無法直接訪問到WEB-INF里的資源
5.可以訪問工程外的資源(比如說調(diào)轉(zhuǎn)的百度等等)
什么時(shí)候使用請(qǐng)求重定向?
1.瀏覽會(huì)記錄最后一次請(qǐng)求的所有數(shù)據(jù),客戶端可以通過刷新頁面的方法,重新發(fā)起最后一次請(qǐng)求;
2.而我們?cè)谡?qǐng)求轉(zhuǎn)發(fā)或請(qǐng)求重定向之前,總會(huì)處理一些業(yè)務(wù);此時(shí),如果當(dāng)本次業(yè)務(wù)是對(duì)數(shù)據(jù)庫,本地文件的增刪改操作時(shí),就需要使用請(qǐng)求重定向;
為什么呢?
因?yàn)?,這時(shí)如果我們使用請(qǐng)求轉(zhuǎn)發(fā)(整個(gè)處理業(yè)務(wù)過程就只是一次請(qǐng)求),瀏覽就會(huì)記錄我們這次請(qǐng)求(操作數(shù)據(jù)庫),一旦客戶端刷新頁面,就會(huì)執(zhí)行(操作數(shù)據(jù)庫)的請(qǐng)求,這時(shí)很嚴(yán)重的bug,我們要避免,所有就要用到請(qǐng)求重定向;
1.因?yàn)槲覀兠看尾僮魍陻?shù)據(jù)庫,都會(huì)跳轉(zhuǎn)到首頁,或者數(shù)據(jù)展示的頁面,所以這時(shí)我們使用請(qǐng)求重定向跳轉(zhuǎn)到這個(gè)頁面(實(shí)際是跳轉(zhuǎn)到某個(gè)Servlet查詢數(shù)據(jù)庫中的記錄,這個(gè)Servlet再跳轉(zhuǎn)到數(shù)據(jù)展示的頁面);
2.此時(shí)瀏覽器記錄的最后一次請(qǐng)求就是查詢數(shù)據(jù)庫中記錄的請(qǐng)求了,這時(shí)我們刷新頁面,也只是查詢數(shù)據(jù),不再是對(duì)數(shù)據(jù)庫的增刪改了;
總結(jié):當(dāng)我們修改數(shù)據(jù)庫中的數(shù)據(jù)的之后,就需要使用請(qǐng)求重定向來避免上述的問題了;
到此這篇關(guān)于JavaWeb中請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向的區(qū)別以及使用的文章就介紹到這了,更多相關(guān)請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Javaweb-HttpServletResponse的sendRedirectch重定向方式
- 詳解Java從后臺(tái)重定向(redirect)到另一個(gè)項(xiàng)目的方法
- JavaWeb中轉(zhuǎn)發(fā)與重定向的區(qū)別小結(jié)
- 關(guān)于Javaweb的轉(zhuǎn)發(fā)和重定向詳解
- Java通過httpclient比較重定向和請(qǐng)求轉(zhuǎn)發(fā)
- Java請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向區(qū)別詳解
- Javaweb請(qǐng)求轉(zhuǎn)發(fā)及重定向?qū)崿F(xiàn)詳解
- java 轉(zhuǎn)發(fā)和重定向區(qū)別及實(shí)例代碼
- java轉(zhuǎn)發(fā)和重定向的區(qū)別
- Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別
相關(guān)文章
gRPC實(shí)踐之proto及Maven插件概念及使用詳解
這篇文章主要為大家介紹了gRPC實(shí)踐之proto及Maven插件概念及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04SpringBoot詳細(xì)分析自動(dòng)裝配原理并實(shí)現(xiàn)starter
相對(duì)于傳統(tǒng)意義上的Spring項(xiàng)目,SpringBoot具有開箱即用,簡(jiǎn)化配置,內(nèi)置Tomcat等等等等一系列的特點(diǎn)。在這些特點(diǎn)中,最重要的兩條就是約定優(yōu)于配置和自動(dòng)裝配2022-07-07啟用設(shè)置org.slf4j.Logger打印并輸出日志方式
這篇文章主要介紹了啟用設(shè)置org.slf4j.Logger打印并輸出日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11學(xué)習(xí)Java之IO流中有哪些復(fù)雜的API
這篇文章我們要先對(duì)IO流的API有個(gè)基本的認(rèn)知,因?yàn)镮O流的類和方法太多了,我們不得不專門學(xué)習(xí)一下,所以本文就給大家詳細(xì)的講講Java?IO流中復(fù)雜的API,需要的朋友可以參考下2023-09-09Java基于NIO實(shí)現(xiàn)群聊系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java基于NIO實(shí)現(xiàn)群聊系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Java 守護(hù)線程_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Java語言機(jī)制是構(gòu)建在JVM的基礎(chǔ)之上的,意思是Java平臺(tái)把操作系統(tǒng)的底層給屏蔽起來,所以它可以在它自己的虛擬的平臺(tái)里面構(gòu)造出對(duì)自己有利的機(jī)制,而語言或者說平臺(tái)的設(shè)計(jì)者多多少少是收到Unix思想的影響,而守護(hù)線程機(jī)制又是對(duì)JVM這樣的平臺(tái)湊合,于是守護(hù)線程應(yīng)運(yùn)而生2017-05-05基于spring AOP @Around @Before @After的區(qū)別說明
這篇文章主要介紹了基于spring AOP @Around @Before @After的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02