java中的302和sendRedirect的區別
java中有一個sendRedirect函式這個用於跳轉到另外一個頁面,這個實際上是一個302跳轉,但是不完全等同於302跳轉
點選(此處)摺疊或開啟
- response.sendRedirect("login.jsp");
- 不等於
- response.addHeader("location", "login.jsp");
- 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優化非常有好處