servlet 轉發與重定向
轉發與重定向
什麼是轉發
轉發是指我們的一個請求處理器(ServletA)將請求交給另一個處理器處理(ServletB),再講結果返回。
基本流程
客戶首先傳送一個請求到伺服器端,伺服器端發現匹配的servlet,並指定它去執行,當這個servlet執行完之後,它要呼叫getRequestDispacther()方法,把請求轉發給指定的student_list.jsp,整個流程都是在伺服器端完成的,而且是在同一個請求裡面完成的,因此servlet和jsp共享的是同一個request,在servlet裡面放的所有東西,在student_list中都能取出來,因此,student_list能把結果getAttribute()出來,getAttribute()出來後執行完把結果返回給客戶端。整個過程是一個請求,一個響應。
原理圖
特點
使用者瀏覽器的位址列不會被更改,也就是說,使用者訪問什麼地址就跳轉到什麼地址,和使用者的輸入地址一致。
Servlet之間使用的是同一個request物件,什麼意思呢?
示例
以我們熟悉的程式碼為例子,這是很簡單的設計模式,根據if條件判斷要執行哪一條方法,方法1將引數交給方法2處理,這是很常見的業務拆分。
pubic void 方法1(引數1,引數2){
if(...){
方法2(引數1,引數2);
}
else{
方法3(引數1,引數2);
}
}
pubic void 方法2(引數1,引數2){
}
pubic void 方法3(引數1,引數2){
}
servlet也如此,我們有的時候會將業務拆分,讓不同的servlet處理更加單一的事情,然後使用轉發技術進行相互的呼叫,並且使用同一個requset和response物件。
public class servlet1 implements Servlet{
if(...){
request.getRequestDispatcher("/servlet2").forward(request, response);
}
else{
request.getRequestDispatcher("/servlet3").forward(request, response);
}
}
@WebServlet("/servlet2")
public class servlet2 implements Servlet{
...
}
@WebServlet("/servlet3")
public class servlet3 implements Servlet{
...
}
當然轉發的Servlet處理完之後可以再進行轉發。舉個例子登入驗證Servlet1是登入驗證,Servlet2是登入安全驗證。
//檢視賬號密碼是否正確
request.getRequestDispatcher("/servlet1").forward(request, response);
...
//檢視登入裝置是否是已認證裝置
request.getRequestDispatcher("/servlet2").forward(request, response);
什麼是重定向
當我們的請求處理器接收到請求時,不處理請求而是告訴使用者瀏覽器應該傳送ABC請求,然後使用者瀏覽器再跳轉到ABC請求。
基本流程
客戶傳送一個請求到伺服器,伺服器匹配servlet,servlet處理完之後呼叫了sendRedirect()方法,立即向客戶端返回這個響應,響應行告訴客戶端你必須要再傳送一個請求,去訪問student_list.jsp,緊接著客戶端收到這個請求後,立刻發出一個新的請求,去請求student_list.jsp,這裡兩個請求互不干擾,相互獨立,在前面request裡面setAttribute()的任何東西,在後面的request裡面都獲得不了。可見,在sendRedirect()裡面是兩個請求,兩個響應。(伺服器向瀏覽器傳送一個302狀態碼以及一個location訊息頭,瀏覽器收到請求後會向再次根據重定向地址發出請求)
原理圖
特點
使用者瀏覽器位址列會變化
使用不同的request物件
示例
使用者訪問個人網站時,我們應該判斷一下他有沒有登入,如果說登入過了,直接可以進入主頁,否則,應該讓他去登入介面登入。
if(isLogin()){
主頁();
}
else{
respoonse.sendRedirect("\虛擬路徑\login");
}
區別
注意:
重定向是告訴使用者瀏覽器應該使用哪一個URL地址,所以我們必須給完整的訪問地址,虛擬路徑+請求地址。
轉發是大家都在一個工作環境下的,你知道我我知道你,所以我們轉發之間只需要輸入/serlvet2另一個Servlet的請求地址即可,不用加虛擬路徑
相關文章
- 【轉發與重定向(二)】
- 請求轉發與URL重定向
- 轉發和重定向
- Springmvc中轉發和重定向SpringMVC
- Spring MVC 轉發和重定向SpringMVC
- 轉發和重定向的區別?
- Javaweb的轉發與重定向的區別以及解決重定向不能共享資料的問題JavaWeb
- SpringMVC---02---實現頁面的跳轉 轉向與重定向SpringMVC
- [轉]重定向輸出
- 轉發和重定向的過程和區別
- URL重定向/跳轉漏洞
- java servlet 與jsp幾種頁面跳轉的方法JavaServletJS
- 轉發和重定向又是什麼“垃圾”——教你再分類
- 教你如何實現SpringCloud URL的重定向及轉發SpringGCCloud
- 記錄web中的servlet轉發及jsp的接受WebServletJS
- APEX重定向頁跳轉1
- javaWeb03-請求轉發和請求重定向【包含編碼格式與路徑問題】JavaWeb
- Web 開發學習筆記(4) — 重定向與HSTSWeb筆記
- 淺嘗Spring註解開發_Servlet3.0與SpringMVCServletSpringMVC
- Servlet生命週期與方法Servlet
- Filter 與 Servlet 的區別FilterServlet
- Spring 容器與 Servlet互動SpringServlet
- PHP重定向與偽靜態PHP
- 基於Servlet體系的HTTP請求代理轉發Spring Boot元件ServletHTTPSpring Boot元件
- JAVA網路程式設計基本功之Servlet與Servlet容器Java程式設計Servlet
- Servlet與Netty橫向對比ServletNetty
- Servlet開發-day05Servlet
- [譯]Flask教程–重定向與錯誤Flask
- java EE開發之Servlet第一課:servlet的建立方式JavaServlet
- java EE開發之Servlet第二課:Servlet的三個hashMapJavaServletHashMap
- Haproxy 重定向跳轉設定 - 運維小結運維
- JavaWeb開發基礎Servlet APIJavaWebServletAPI
- 管道符、重定向與環境變數變數
- Servlet 規範和 Servlet 容器Servlet
- Servlet系列:(一)servlet原理剖析Servlet
- CentOS 管道符、重定向與環境變數CentOS變數
- 重定向
- 96.Servlet Servlet生命週期Servlet