今天敲書上的例子的時候無意間發現,response中的sendRedirect()重定向到另一個servlet時,調用的是doget方法,不明所以,百度得知,原來還牽扯到http協議的細節問題,原文如下:
servlet重定向一般采用response.sendRedirect()來處理,要明白其中的細節,還需了解HTTP協議的一些內容,簡單點就是要了解HTTP請求報頭、HTTP狀態碼、HTTP響應報頭的一些參數。
sendRedirect()簡單點就是做了兩件事情:
設置HTTP響應報頭中的Status為302;
設置HTTP響應報頭中的Location值為指定的URL;
簡單相當於這樣:
- response.setStatus(302);
- 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:
- response.setStatus(307);
- response.setHeader("Location", "OtherServlet");
這樣瀏覽器就會向Location里的URI重新發起POST請求。