在开发JavaWeb项目中,我们经常会用到转发网页,使我们从一个网页转入另一个网页,而转发分为两种:直接转发以及间接转发。
而Forward以及Redirect分别就代表了这两种不同的请求转发方式。而这两种转发方式有什么区别呢?
所谓直接转发方式,就是客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
而所谓的间接转发方式,就是是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
从数据共享的方面来说,如果采用直接转发方式,可以共享request里面的数据,而如果使用间接转发方式,则不会共享request里面的数据,这也是两者最为关键的区别。
转发的过程:客户浏览器发送http请求,之后web服务器接受此请求,随后调用内部的一个方法在容器内部完成请求处理和转发动作,最后将目标资源发送给客户,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。
重定向过程:客户浏览器发送http请求,web服务器接受后发送302状态码响应及对应新的location给客户浏览器-,随后客户浏览器发现 是302响应,则自动再发送一个新的http请求,请求url是新的location地址,最终服务器根据此请求寻找资源并发送给客户。在这里 location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的 路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
直接转发:
<body>
<jsp:forward page="index.htm"/>
</body>
`
重定向:
//Servlet中处理get请求的方法
public void doGet(HttpServletRequest request,HttpServletResponse response){
//请求重定向到另外的资源
response.sendRedirect(“资源的URL”);
}