【001】转发与重定向区别
一、请求的两种操作方式
在进行servlet+jsp简单功能构建的时候发现在访问jsp页面时遇到这两种操作方式:
1、req.getRequestDispatcher("jsp/index.jsp").forward(req, resp);
2、resp.sendRedirect("jsp/index.jsp");
这两种方式浏览器在请求该servlet的时候都可以访问到jsp页面,但是他们的区别貌似这么长时间没有接触到servlet比较基础的东西有些模糊了,通过网上搜索查看一些资料进行重新了解了一下。
req.getRequestDispatcher("jsp/index.jsp").forward(req, resp)方法叫做转发(服务器行为由servlet直接将资源返回浏览器完成的),而resp.sendRedirect("jsp/index.jsp")方法叫做重定向(浏览器行为,由浏览器重新定位访问对应资源的方式)
二、转发与重定向的具体操作时序图:
1、转发:req.getRequestDispatcher("jsp/index.jsp").forward(req, resp),通过servlet的request内部请求访问转发的资源,由服务器进行操作,客户端(浏览器)对服务器内部的转发不感知。
时序图:
操作演示:浏览器访问通过转发的方式响应时,浏览器的地址栏不会变更。
2、重定向:resp.sendRedirect("jsp/index.jsp"),通过response直接将资源路径返回给浏览器,由浏览器重新发起对服务器的请求(这里资源路径也可以是其他web站点的资源),也就是浏览器会对服务器进行两次请求。
操作演示:进行重定向访问时浏览器的地址栏的url会发生变化,变为第二次请求访问的资源url
三、转发与重定向关于路径的试探
1、转发url相对路径与绝对路径的访问结果:绝对路径与相对路径对服务器转发来说无影响。(?)
使用相对路径req.getRequestDispatcher("jsp/index.jsp").forward(req, resp);
使用绝对路径req.getRequestDispatcher("/jsp/index.jsp").forward(req, resp);
2、重定向url相对路径与绝对路径的访问结果:相对路径访问时以web站点项目路径为前缀返回浏览器的,绝对路径访问时以web站点路径为前缀访问路径的。
使用相对路径resp.sendRedirect("jsp/index.jsp");
使用绝对路径resp.sendRedirect("/jsp/index.jsp");
四、转发与重定向的特性总结:
通过时序图可以比较出两者的不同:
1、重定向时浏览器会发起两次请求;转发时浏览器只进行了一次请求。
2、重定向因为是两次请求所以第一次的request与第二次请求的request是不一样的,数据不可传递;转发因为是servlet的行为,是服务器内部把对一个request/response的处理权,移交给另外一个处理程序,数据是可传递的。
3、重定向时servlet将资源url发送给客户端,由客户端进行重新请求,那么这个url可以是任意的资源请求url;转发因为时servlet的服务器端操作的行为,所以只能转发服务器的该web内站点资源url。