response.sendRedirect的細節


今天敲書上的例子的時候無意間發現,response中的sendRedirect()重定向到另一個servlet時,調用的是doget方法,不明所以,百度得知,原來還牽扯到http協議的細節問題,原文如下:

servlet重定向一般采用response.sendRedirect()來處理,要明白其中的細節,還需了解HTTP協議的一些內容,簡單點就是要了解HTTP請求報頭、HTTP狀態碼、HTTP響應報頭的一些參數。 

sendRedirect()簡單點就是做了兩件事情: 
設置HTTP響應報頭中的Status為302; 
設置HTTP響應報頭中的Location值為指定的URL; 
簡單相當於這樣: 

Java代碼   收藏代碼
  1. response.setStatus(302);  
  2. response.setHeader("Location", "OtherServlet");  



瀏覽器會根據狀態碼來作出相應的響應; 

瀏覽器對相應的狀態碼的響應(這里只給出了幾個3開頭的)是: 
302 作為HTTP1.0的標准,以前叫做Moved Temporarily ,現在叫Found. 現在使用只是為了兼容性的處理,response.sendRedirect()的默認Location重定向用的是302. 
但是HTTP 1.1 有303 和307作為詳細的補充,其實是對302的細化 
303:對於POST請求,它表示請求已經被處理,客戶端可以接着使用GET方法去請求Location里的URI。 
307:對於POST請求,表示請求還沒有被處理,客戶端應該向Location里的URI重新發起POST請求。 

瀏覽器對302的響應,默認情況下,使用HTTP協議的GET方法提交請求,最初請求的內容(比如 POST 參數)也就丟失了。 
所以response.sendRedirect()是不能讓瀏覽器來以post方法提交請求的。 

你想在servlet中用post傳參數,在瀏覽器支持HTTP1.1的情況下可以設置狀態碼為307: 

Java代碼   收藏代碼
  1. response.setStatus(307);  
  2. response.setHeader("Location", "OtherServlet");  



這樣瀏覽器就會向Location里的URI重新發起POST請求。 

http://www.iteye.com/problems/61747


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM