servlet 轉發與重定向

蛇皮怪物發表於2020-11-02

轉發與重定向

什麼是轉發

轉發是指我們的一個請求處理器(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的請求地址即可,不用加虛擬路徑

相關文章