servlet中經常使用到的兩種轉向,以前沒注意到這兩種轉向的區別,如今進行下記錄與分享。 html
1.從地址顯示來講
forward是服務器請求資源,好比你轉向的地址爲2.jsp,這時服務器先本身直接訪問2.jsp,把這個地址的內容讀出來,而後把這些內容再發給瀏覽器。因此地址欄仍是你訪問servlet那個地址欄(若是你用jsp實現地址就不變),它不會變成2.jsp。瀏覽器不知道這些內容是服務器從地址2.jsp拿過來的。 java
redirect則相反,是服務端根據邏輯,發送一個狀態碼高速瀏覽器從新去請求那個2.jsp地址,因此地址欄顯示的是新的URL。 跨域
2.從數據共享來講
forward轉發頁面和轉發到的頁面能夠共享request裏面的內容;redirect不能共享數據。 瀏覽器
3.從運用地方來講
forward通常用於用戶登陸時候,根據角色轉發到相應的模塊(由於這時可能須要共享些數據)。
redirect通常用於用戶註銷登陸時返回主頁面和跳轉到其餘的網站。 服務器
4.forward不能跨域訪問,redirect能夠跨域訪問
可能有些讀者還不清楚跨域訪問的概念。跨域訪問就是post/get不是你本身的網站、域名不一樣的訪問。 jsp
5.從協議的角度來講
forward的實現與協議無關。從原理上看,forward是container內部在response以前對request的處理。
而redirect方式是利用http協議中的redirect機制讓客戶發起新的請求,轉向新的url。 post
從這個角度去看二者的區別,天然能很好地解析產生上面四點的不一樣的緣由了。 測試
因此,在處理登陸/註銷頁面的轉向時,要注意forward與redirect所帶來的不一樣效果 網站
下面作了一個例子來驗證
邏輯以下1.jsp點擊登陸→servlet①給request寫入attribute②進行forward或redirect轉向→2.jsp
1.jsp url
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <a href="./OutServlet">登陸</a> </body> </html>servlet
public class OutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //測試是否是共享request request.setAttribute("name", "test"); //進行forward轉向 // request.getRequestDispatcher("./2.jsp").forward(request, response); //進行redirect轉向 response.sendRedirect("./2.jsp"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP '2.jsp' starting page</title> </head> <body> <p>測試是否是共享reques</p> 結果:<%=request.getAttribute("name")%> </body> </html>