JavaWeb重定向与请求转发的区别和执行流程之图解分析
欢迎各位大神予以指教
个人看法
由于我们专业的主要方向式webApp开发,所以不可避免的要接触到HTTP的servlet的知识,而servlet中的重定向与请求转发式比较让人比较迷惑的,我不想讨论技术的对错,技术不分好坏,只有人才分。
这两个技术各有千秋!但是在不考虑服务器的性能的情况下我还是更倾向于使用请求转发,因为它不会把url暴露出来。
调用方式区别
写过这么多的代码了,我想servlet中的调用转发、重定向的语句应该已经融入灵魂之中了吧!
虽然这么说,但是作为好人的我还是要将此代码公布与众,请求转发的语句是:
request.getRequestDispatcher("login.jsp").forward(request,response);
重定向是:
response.sendRedirect("login.jsp");
以上是在servlet中的代码,那么要是在jsp页面要该怎么办呢?其实也很简单,各位看官看好了,接下来的代码会让天地失色,大神瞪眼:
<jsp:forward page="login.jsp"/> //请求转发 <%response.sendRedirect("login.jsp");//重定向到new.jsp%>
相信各位大侠看到这可能会有所疑惑,那到底是什么啊?
哪还是来张图吧!毕竟一图顶千言啊!
请求转发图解
美女A对帅哥B说,帮我取一下快递然后放到我桌子上呗,同学!
然后帅哥B又对美女C也说了同样的话,只不过是经过转述过的,A不知道是C帮她取的快递!
接着C将快递放到A指定的地方!
这里A相当于浏览器,B/C都是浏览器。
重定向图解
故事讲解
假如你需要办理某种商品,
请求转发版式:你先去了A公司,A公司的人说我们不生产这种商品,你应该去隔壁的B公司,然后你就自己去B公司购买了商品
重定向版式:你先去A公司,A公司知道自己公司不生产这种商品而B公司生产,A公司不想失去你这个客户也不想让你知道,所以B公司偷偷的联系B公司,让他们把货送来。
本质区别
还是来介绍一下他们的本质区别吧
一句话,转发是服务器的行为,重定向是客户端的行为。为什么这么说呢,之前已将讲过了,转发必须是同一个web容器下的url,不能转发到其他的web路径下去,中间传递的是自己容器内的request。在客户浏览器路径栏显示的任然是第一次的url,也就是说用户感觉不到服务器做了转发。转发行为是浏览器只做一次访问请求。
重定向过程相对来说比较复杂:客户浏览器发送http请求--->web服务器接受后发送302状态码响应及对新的url给客户浏览器--->客户浏览器发现是302响应,则自动再发送一个新的http请求,请求的是新的url地址,在这里的路径可以是任意URL,在客户浏览器显示新的URL地址,重定向做了至少两次请求。
让我们用表格来终结这个知识点
序号 | 问题 | 重定向 | 请求转发 |
1 | 第二次请求谁请求的? | 浏览器 | 服务器 |
2 | 浏览器发送了几次请求? | 2次以上 | 1次 |
3 | servlet可以共享request吗? | 不可以 | 可以 |
4 | 地址栏是否发生改变? | 是 | 不是 |
5 | 浏览器地址栏显示的哪一次访问地址? | 最后一次 | 第一次 |
6 | 可以跳转到什么资源? | 任意资源 | 项目内部 |
7 | 第二次的请求路径是? | 绝对路径 | 内部路径 |