JavaWeb中請求轉(zhuǎn)發(fā)和請求重定向的區(qū)別以及使用
什么是請求轉(zhuǎn)發(fā)?
請求轉(zhuǎn)發(fā)是指,服務器收到請求后,從一次資源跳轉(zhuǎn)到另一個資源的操作。
請求轉(zhuǎn)發(fā)的特點
1.瀏覽器地址欄不會發(fā)生變化
2.他們一次請求,服務器完成轉(zhuǎn)發(fā)操作
3.共享Request域中的數(shù)據(jù)
4.可以轉(zhuǎn)發(fā)到WEB-INF目錄下
5.不可以訪問工程以外的資源
舉個例子:
1.一個公司有多個部門,其中部門1(Servlet1)向客戶提供了自己能夠提供的服務,但是還有一部分服務自己提供不了,需要其他部門的服務;
2.所以部門1(Servlet1)將客戶的文件蓋一個章,證明部門1已經(jīng)提供了服務,然后將其轉(zhuǎn)交(請求轉(zhuǎn)發(fā))到部門2(Servlet2);
3.部門2檢查部門1是否蓋過章了,如果蓋過章就繼續(xù)向客戶提供服務…;
4.直到所有服務都處理完,將客戶需要的數(shù)據(jù)提供給客戶(即,將數(shù)據(jù)轉(zhuǎn)發(fā)給客戶端**[轉(zhuǎn)發(fā)到某個頁面]**);
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先獲取請求參數(shù),看看servlet1需要做的事 String username = request.getParameter("username"); System.out.println(username); //.....部門1提供自己的服務 //2.servlet1設置一個參數(shù)證明servlet1轉(zhuǎn)發(fā)的請求(部門1蓋一個章) request.setAttribute("key1", "servlet1"); //3.查詢servlet2的路徑,(部門1將其轉(zhuǎn)交給部門1) RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2"); //4.把請求和響應轉(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查看客戶需要的服務 System.out.println("Servlet2查看參數(shù): "+request.getParameter("username")); //部門2查看部門1有沒有蓋章,判斷是否繼續(xù)服務 System.out.println("Servlet2查看是否有Servlet1的證明: "+request.getAttribute("key1")); //部門2處理完自己的服務, System.out.println("Servlet處理自己的業(yè)務"); } }
注意
1.這時候如果我們將Servlet2放在WEB_INF下,那么我們就無法直接訪問servlet2了;
2.但是我們可以通過請求轉(zhuǎn)發(fā)來實現(xiàn)訪問servlet2;
思考:登錄功能和這種請求轉(zhuǎn)發(fā)方法類似,我們無法跳過登錄界面直接訪問系統(tǒng),所有我們可以用這種請求轉(zhuǎn)發(fā)的方法來實現(xiàn);
什么是請求重定向?
請求重定向:是指客戶端發(fā)送請求,然后服務器告訴客戶端,我給你一個地址,你去新的地址訪問(之前的地址可能已經(jīng)被廢棄,或者之前的地址[Servlet]無法滿足需求);
第一種方案
// 設置響應狀態(tài)碼 302 ,表示重定向,(已搬遷) resp.setStatus(302); // 設置響應頭,說明 新的地址在哪里 resp.setHeader("Location", http://localhost:8080);
第二種方案(推薦使用)
resp.sendRedirect(http://localhost:8080);
請求重定向的特點
1.瀏覽器的地址欄會發(fā)生變化
2.瀏覽器發(fā)送了兩次請求,而不是像調(diào)用request的getRequestDispatcher("/a/b/c.html").forward(request, response)方法實現(xiàn)的;所以一共創(chuàng)建了兩個request對象
3.兩個request對象不能共享域數(shù)據(jù)
4.重定向不能訪問WEB-INF里的資源,因為兩次請求都是客戶端發(fā)起的,客戶端無法直接訪問到WEB-INF里的資源
5.可以訪問工程外的資源(比如說調(diào)轉(zhuǎn)的百度等等)
什么時候使用請求重定向?
1.瀏覽會記錄最后一次請求的所有數(shù)據(jù),客戶端可以通過刷新頁面的方法,重新發(fā)起最后一次請求;
2.而我們在請求轉(zhuǎn)發(fā)或請求重定向之前,總會處理一些業(yè)務;此時,如果當本次業(yè)務是對數(shù)據(jù)庫,本地文件的增刪改操作時,就需要使用請求重定向;
為什么呢?
因為,這時如果我們使用請求轉(zhuǎn)發(fā)(整個處理業(yè)務過程就只是一次請求),瀏覽就會記錄我們這次請求(操作數(shù)據(jù)庫),一旦客戶端刷新頁面,就會執(zhí)行(操作數(shù)據(jù)庫)的請求,這時很嚴重的bug,我們要避免,所有就要用到請求重定向;
1.因為我們每次操作完數(shù)據(jù)庫,都會跳轉(zhuǎn)到首頁,或者數(shù)據(jù)展示的頁面,所以這時我們使用請求重定向跳轉(zhuǎn)到這個頁面(實際是跳轉(zhuǎn)到某個Servlet查詢數(shù)據(jù)庫中的記錄,這個Servlet再跳轉(zhuǎn)到數(shù)據(jù)展示的頁面);
2.此時瀏覽器記錄的最后一次請求就是查詢數(shù)據(jù)庫中記錄的請求了,這時我們刷新頁面,也只是查詢數(shù)據(jù),不再是對數(shù)據(jù)庫的增刪改了;
總結(jié):當我們修改數(shù)據(jù)庫中的數(shù)據(jù)的之后,就需要使用請求重定向來避免上述的問題了;
到此這篇關于JavaWeb中請求轉(zhuǎn)發(fā)和請求重定向的區(qū)別以及使用的文章就介紹到這了,更多相關請求轉(zhuǎn)發(fā)和請求重定向內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Javaweb-HttpServletResponse的sendRedirectch重定向方式
- 詳解Java從后臺重定向(redirect)到另一個項目的方法
- JavaWeb中轉(zhuǎn)發(fā)與重定向的區(qū)別小結(jié)
- 關于Javaweb的轉(zhuǎn)發(fā)和重定向詳解
- Java通過httpclient比較重定向和請求轉(zhuǎn)發(fā)
- Java請求轉(zhuǎn)發(fā)和請求重定向區(qū)別詳解
- Javaweb請求轉(zhuǎn)發(fā)及重定向?qū)崿F(xiàn)詳解
- java 轉(zhuǎn)發(fā)和重定向區(qū)別及實例代碼
- java轉(zhuǎn)發(fā)和重定向的區(qū)別
- Java中forward轉(zhuǎn)發(fā)與redirect重定向的區(qū)別
相關文章
SpringBoot詳細分析自動裝配原理并實現(xiàn)starter
相對于傳統(tǒng)意義上的Spring項目,SpringBoot具有開箱即用,簡化配置,內(nèi)置Tomcat等等等等一系列的特點。在這些特點中,最重要的兩條就是約定優(yōu)于配置和自動裝配2022-07-07基于spring AOP @Around @Before @After的區(qū)別說明
這篇文章主要介紹了基于spring AOP @Around @Before @After的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02