今天遇到了一個超級鬱悶的問題,在公司的門戶上做了二開,理想的效果是用戶通過我給定的URI提交數據之後,若數據正確跳轉到首頁,若錯誤則跳轉到登錄頁。修改完成之後部署上,發現無論用戶給出的憑據是正確還是錯誤都往錯誤頁上跳轉。
調試過程中我發現,用戶輸入正確的憑據以後系統確實往主頁跳轉了,但是最後的結果卻是又返回到了登錄頁。仔細查看代碼後發現,我在往主頁跳轉的時候,錯誤的使用了forward,造成不能將用戶本地的cookie等憑證帶到主頁,令系統以爲我已經退出了,故又返回了登錄頁。
關於redirect與forwad的區別,找到一篇博文,見下:(轉載自:http://blog.csdn.net/tenor/article/details/4077079)在Servlet中兩種實現:
forward方式:request.getRequestDispatcher("/somePage.jsp").forward(request, response);
redirect方式:response.sendRedirect("/somePage.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則不行。
2、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>例子
<%@ page contentType="text/html;charset=gb2312" %>
<html>
<head>
<title>test</title>
</head>
<body>
<jsp:forward page="forwardTo.jsp">
<jsp:param name="userName" value="riso"/>
</jsp:forward>
</body>
</html>
forwardTo.jsp
<%@ page contentType="text/html;charset=gb2312" %>
<!--forwardTo.jsp-->
<%
String useName=request.getParameter("userName");
String outStr= "謝謝光臨!";
outStr+=useName;
out.println(outStr);
%>
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造成的一些未知後果(例如連續刪除)
原文地址:http://www.kaisir.com/2013/05/java-redirect-and-forward-the-difference-between.html