java中的302和sendRedirect的区别

Posted 常生果

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的302和sendRedirect的区别相关的知识,希望对你有一定的参考价值。

java中有一个sendRedirect函数这个用于跳转到另外一个页面,这个实际上是一个302跳转,但是不完全等同于302跳转

 

点击(此处)折叠或打开

  1. response.sendRedirect("login.jsp");
  2. 不等于
  3.  
  4. response.addHeader("location", "login.jsp");
  5. 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优化非常有好处

以上是关于java中的302和sendRedirect的区别的主要内容,如果未能解决你的问题,请参考以下文章

java中的302和sendRedirect的区别

Java 中的 URL 重定向返回 302 而不是 301

java 中sendredirect()和forward()方法的区别

关于java中sendRedirect,forward和include区别

JAVA学习——forward和sendRedirect区别总结

重定向与转发的区别学习笔记