內部跳轉和外部跳轉的區別,底層實現原理
阿新 • • 發佈:2019-02-18
他們的區別是:
response.sendRedirect是向客戶瀏覽器傳送頁面重定向指令,瀏覽器接收後將向web伺服器重新發送頁面請求,所以執行完後瀏覽器的url顯示的是跳轉後的頁面。跳轉頁面可以是一個任意的url(本伺服器的和其他伺服器的均可)。
RequestDispatcher.forward則是直接在伺服器中進行處理,將處理完後的資訊傳送給瀏覽器進行顯示,所以完成後在url中顯示的是跳轉前的頁面。在forward的時候將上一頁面中傳送的request和response資訊一同傳送給下一頁面(而response.sendRedirect不能將上一頁面的request和response資訊傳送到下一頁面)。由於forward是直接在伺服器中進行處理,所以forward的頁面只能是本伺服器的。
JSP:
1) response.sendRedirect();
和servlet的response.sendRedirect()方式一樣。
此語句前不允許有out.flush(),如果有,會有異常:
java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.
at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)
...
跳轉後瀏覽器位址列變化
如果要跳到不同主機下,跳轉後,此語句後面的語句會繼續執行,如同新開了執行緒,但是對response的操作已經無意義了;
如果要跳到相同主機下,此語句後面的語句執行完成後才會跳轉;
2) response.setHeader("Location","");
此語句前不允許有out.flush(),如果有,頁面不會跳轉。
跳轉後瀏覽器位址列變化
此語句後面的語句執行完成後才會跳轉
3) <jsp:forward page="" />
此語句前不允許有out.flush(),如果有,會有異常:
java.lang.IllegalStateException: forward() not allowed after buffer has committed.
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:134)
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:101)
at com.caucho.jsp.PageContextImpl.forward(PageContextImpl.java:836)
...
跳轉後瀏覽器位址列不變,但是隻能跳到當前主機下
此語句後面的語句執行完成後才會跳轉
JSP:
1) response.sendRedirect();
和servlet的response.sendRedirect()方式一樣。
此語句前不允許有out.flush(),如果有,會有異常:
java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.
at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)
...
跳轉後瀏覽器位址列變化
如果要跳到不同主機下,跳轉後,此語句後面的語句會繼續執行,如同新開了執行緒,但是對response的操作已經無意義了;
如果要跳到相同主機下,此語句後面的語句執行完成後才會跳轉;
2) response.setHeader("Location","");
此語句前不允許有out.flush(),如果有,頁面不會跳轉。
跳轉後瀏覽器位址列變化
此語句後面的語句執行完成後才會跳轉
3) <jsp:forward page="" />
此語句前不允許有out.flush(),如果有,會有異常:
java.lang.IllegalStateException: forward() not allowed after buffer has committed.
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:134)
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:101)
at com.caucho.jsp.PageContextImpl.forward(PageContextImpl.java:836)
...
跳轉後瀏覽器位址列不變,但是隻能跳到當前主機下
此語句後面的語句執行完成後才會跳轉