forward與redirect的區別

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>
相關文章
相關標籤/搜索