Spring中redirect和forward的區別

原文地址:http://blog.csdn.net/tenor/article/details/4077079php

 

SetCookie、GetCookiehtml

自行設定有效日期:java

Response.Cookies(CookieName).Expires=#日期#express

頁面轉發區別:瀏覽器

在Servlet中兩種實現: 服務器

      forward方式:request.getRequestDispatcher("/somePage.jsp").forward(request, response);網絡

      redirect方式:response.sendRedirect("/somePage.jsp");jsp

      forward是服務器內部重定向,程序收到請求後從新定向到另外一個程序,客戶機並不知道;redirect則是服務器收到請求後發送一個狀態頭給客戶,客戶將再請求一次,這裏多了兩次網絡通訊的來往。固然forward也有缺點,就是forward的頁面的路徑若是是相對路徑就會有些問題了。性能

      forward 會將 request state , bean 等等信息帶往下一個 jsp。redirect 是送到 client 端後再一次 request , 因此資料不被保留。使用 forward 你就能夠用 getAttribute() 來取的前一個 jsp 所放入的 bean 等等資料。網站

 

forward是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址,他是不會改變Request的值,若是你須要在下一個頁面中能從中獲取新的信息的話,你能夠Request.setAttribute()來放置一些標誌,這樣從下一個頁面中獲取。

redirect是徹底的跳轉,瀏覽器將會獲得跳轉的地址, 並從新發送請求連接。這樣,從瀏覽器的地址欄中能夠看到跳轉後的連接地址。因此,forward更加高效,在forward能夠知足須要時,儘可能使用Request Dispatcher.forward()方法,而且,這樣也有助於隱藏實際的連接。在有些狀況下,好比,須要跳轉到一個其它服務器上的資源,則必須使用 HttpServletResponse.sendRequest()方法。

forward與include共亨Request範圍內的對象,而redirect則不行,即:若是一個javabean被聲明爲request範圍的話,則被forward到的資源也能夠訪問這個javabean,而redriect則不行。
二、forward與include基本上都是轉發到context內部的資源,而redirect能夠重定向到外部的資源,如: req.sendRedriect("http://www.mocuai.com");

forward 是服務器內部重定向,程序收到請求後從新定向到另外一個程序,而客戶機並不知曉;

forward會將   request  state、bean、等信息帶到下一個jsp頁面;

使用getAttribute()來取得前一個jsp所放的信息

redirect  是服務器收到請求後發送一個狀態頭給客戶,客戶將再次請求,就有兩次網絡通行的來往。

redirect 是送到客戶端後再次request,所以上一個jsp的信息不被保留

forward方式:request.getRequestDispatcher("/somePage.jsp").forward(request, response);

redirect方式:response.sendRedirect("/somePage.jsp");

redirect forward的區別

1.從地址欄顯示來講

forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容
再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪裏來的,因此它的地址欄仍是原來的地址.
redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址.因此地址欄顯示的是新的URL.所
以redirect等於客戶端向服務器端發出兩次request,同時也接受兩次response。


2.從數據共享來講

forward:轉發頁面和轉發到的頁面能夠共享request裏面的數據.

假如從a頁面 到 b頁面 再到c頁面 若是用

在a頁面中:

request.setAttribute("a","aa");

<jsp:forward page="b.jsp"></jsp:forward>

在b頁面中:

<jsp:forward page="c.jsp"></jsp:forward>

跳轉 在c頁面用

request.getAttribute("a")

就能夠獲得a頁面的值,或者用

request.getParameter("name")

也能夠獲得。

可是要用response.sendRedirect("b.jsp");

跳轉的話就得不到a 頁面的值和內容。

redirect:不能共享數據.
redirect不只能夠重定向到當前應用程序的其餘資源,還能夠重定向到同一個站點上的其餘應用程序中的資源,
甚至是使用絕對URL重定向到其餘站點的資源.
forward,方法只能在同一個Web應用程序內的資源之間轉發請求.
forward 是服務器內部的一種操做.
redirect 是服務器通知客戶端,讓客戶端從新發起請求.
因此,你能夠說 redirect 是一種間接的請求, 可是你不能說"一個請求是屬於forward仍是redirect "

3.從運用地方來講

forward:通常用於用戶登錄的時候,根據角色轉發到相應的模塊.
redirect:通常用於用戶註銷登錄時返回主頁面和跳轉到其它的網站等.

4.從效率來講
forward:高.
redirect:低.

5.jsp 語法

<jsp:forward page={"relativeurl" | "<%= expression %>"} />
或者這樣寫:
<jsp:forward page={"relativeurl" | "<%= expression %>"} >
<jsp:param name="parametername" value="{parametervalue | <%= expression %>}" />+
</jsp:forward> 


6.例子

<jsp:forward page="/servlet/login" />
<jsp:forward page="/servlet/login">
<jsp:param name="username" value="jsmith" />
</jsp:forward>


描述
<jsp:forward>標籤從一個jsp文件向另外一個文件傳遞一個包含用戶請求的request對象.<jsp:forward>標籤如下的代碼,將不能執行.
你可以向目標文件傳送參數和值,在這個例子中咱們傳遞的參數名爲username,值爲scott,若是你使用了<jsp:param>標籤的話,目標文件必須是一個動態的文件,可以處理參數.
若是你使用了非緩衝輸出的話,那麼使用<jsp:forward>時就要當心。
若是在你使用<jsp:forward>以前,jsp文件已經有了數據,那麼文件執行就會出錯.

屬性
page="{relativeurl | <%= expression %>}"
這裏是一個表達式或是一個字符串用於說明你將要定向的文件或url.這個文件能夠是jsp,程序段,或者其它可以處理request對象的文件(如asp,cgi,PHP).
<jsp:param name="parametername" value="{parametervalue | <%= expression %>}" />+
向一個動態文件發送一個或多個參數,這個文件必定是動態文件.
若是你想傳遞多個參數,你能夠在一個jsp文件中使用多個<jsp:param>。name指定參數名,value指定參數值.


<jsp:forward>例子

[html] view plain copy
  1. <%@ page contentType="text/html;charset=gb2312" %>  
  2. <html>  
  3.        <head>  
  4.               <title>test</title>  
  5.        </head>  
  6.        <body>  
  7.               <jsp:forward page="forwardTo.jsp">  
  8.                     <jsp:param name="userName" value="riso"/>  
  9.               </jsp:forward>  
  10.        </body>  
  11. </html>  
  12.   
  13. forwardTo.jsp  
  14. <%@ page contentType="text/html;charset=gb2312" %>  
  15. <!--forwardTo.jsp-->  
  16. <%  
  17.        String useName=request.getParameter("userName");  
  18.        String outStr= "謝謝光臨!";  
  19.        outStr+=useName;  
  20.        out.println(outStr);  
  21. %>  
redirect的例子:

譬 如:client 經過XXX/index.jsp?name=gauss&pwd=123訪問index.jsp,而index.jsp中有< jsp:forward page="login.jsp"/>,則在login.jsp中能夠經過request.getParameter()獲得name和pwd, 而<%response.sendRedirect("login.jsp");%>得不到。

總結:

    A.Redirect等於客戶端向服務器發出兩次request,同時也接受到兩次response。Forward卻只是一次request一次response。相比之下,Forward性能更高。     B.Forward可以存儲request Scope的Attribute而Redirect卻不行。     C.Forward的同時URL並不會變。     D.Forward須要在Servlet中須要經過一個Dispatcher來實現。     E.Redirect可以防止某些狀況下客戶端Refresh形成的一些未知後果(例如連續刪除)

相關文章
相關標籤/搜索