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優化非常有好處


免責聲明!

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



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