一、解釋請求轉發與重定向的原理和效果:
形象解釋:
請求轉發與重定向.png
情景:現在A同學要申請一個教師進行班級活動,有張老師和李主任兩個人,A學生會先去找張老師申請教室。
1.請求轉發:
A同學找到了張老師,然而張老師沒法決定,所以張老師去找李主任,李主任同意,然后張老師通知A同學申請成功了。
2.重定向:
A同學去找張老師,張老師說:“我不管這個,你去找李主任吧”。所以A同學去找李主任,然后得到了審批。
在Java Web中,同學A就是用戶端網頁,張老師就是Servlet(服務器端),李主任就是其他資源,例如其他頁面。
所以,請求轉發其實是服務器操作,是有Servlet來負責轉發請求并返回結果。
而重定向是服務器告訴客戶端要訪問的地址,然后客戶端去訪問這個頁面,也就是客戶端操作
二、請求轉發:
請求轉發能夠保持數據,也就是說從 index.jsp (客戶端)發送的數據經由Servlet發送給目標頁面(假設為thanks.jsp)之后,能從 thanks.jsp 中取出index.jsp中發送的數據。
Servlet保持了客戶端發來的數據,使得轉發之后仍然能取出數據
因此,請求轉發在數據傳輸效率上要高一些
實例:
設置請求轉發:
請求轉發.PNG
將數據發送到 thanks.jsp:
請求轉發2.PNG
1.可以看到,頂部的地址欄顯示的Servlet名,而不是 thanks.jsp
這是因為,Servlet轉發了請求到了thanks.jsp,然后返回給客戶端,這個過程對于客戶端是不可見的,就像學生A不知道張老師與李主任之間的過程一樣
2.第二點:在thanks.jsp中仍然能夠取得在 index.jsp中輸入的數據,所以Servlet保持了數據
三、重定向:
客戶端訪問服務器之后,服務器給客戶端返回一個信息,客戶端根據這個信息再去找目標網頁,所以其實相當于兩次請求,因而第一次發送的數據在第二次發送時就會丟失。(就像學生A對張老師說的話還得再對李主任說一遍一樣)
實例:
這次使用重定向的方式:
response.sendRedirect("/thanks.jsp");
點擊發送請求,結果:
process4162.PNG
結果分析:
1.這里訪問到了 thanks.jsp,所以可以確認的確重定向到了 thanks.jsp
2.正是因為數據沒有傳過來,所以全是 null ,在 thanks.jsp中處理數據時就出現了 空指針錯誤。
(用之前的例子來說:同學A從張老師那里轉到了李主任,卻忘了自己要說什么 )
四、使用情景
請求轉發:
- 在用戶登錄時使用請求轉發時,維持數據以進行檢測
重定向:
- 在用戶注銷時返回主頁面時,丟失數據從而退出當前賬戶
講的不錯的參考博客:
https://blog.csdn.net/qq_41376740/article/details/81064385
https://blog.csdn.net/bailu66/article/details/6914384