1. 程式人生 > >java中的302和sendRedirect的區別

java中的302和sendRedirect的區別

java中有一個sendRedirect函式這個用於跳轉到另外一個頁面,這個實際上是一個302跳轉,但是不完全等同於302跳轉

點選(此處)摺疊或開啟

  1. response.sendRedirect("login.jsp");
  2. 不等於
  3. response.addHeader("location", "login.jsp");
  4. response.setStatus(302);

1.比較

response.sendRedirect("login.jsp");的http請求過程如下:

response.addHeader("location", "login.jsp");

response.setStatus(302);

上面兩個比較發現不同的是藍色部分

response.sendRedirect("login.jsp");在重定向時多加了一段http://localhost:8080/xxxSearch/

2.分析

1)當我們瀏覽器的訪問路徑是http://localhost:8080/xxxSearch/時,

response.sendRedirect("login.jsp");  等於 response.addHeader("location", "login.jsp");response.setStatus(302);

這時在jsp使用request.getContextPath()獲取訪問絕對路徑是可以的

2)但是當我們的瀏覽器的訪問路徑是http://localhost/時就出現問題了

像我公司經常是這樣的結構:用apache做前端,代理後面的tomcat,在tomcat看來訪問路徑還是http://localhost:8080/xxxSearch/,而使用者真實訪問的是http://localhost/

若是用response.sendRedirect("login.jsp");的話,使用者會跳轉到

http://localhost:8080/xxxSearch/login.jsp

若是我們的防火牆不開放8080埠,我們就會看到無法訪問的頁面,而且我們也不想客戶直接訪問到tomcat上。

而用response.addHeader("location", "login.jsp");response.setStatus(302);的話,客戶會訪問到login.jsp,這個路徑是一個相對的路徑再加上客戶瀏覽器的路徑,客戶實際訪問的是

http://localhost/login.jsp

3.結論

因此我認為:

儘量使用

response.addHeader("location", "login.jsp");response.setStatus(302);

而且在jsp頁面裡儘量不要使用request.getContextPath()或者絕對路徑,

這樣我們的程式碼可以很好的通過不同方式訪問,特別是對SEO優化非常有好處