请求转发(Forward)和重定向(Redirect)
req.getRequestDispatcher(“资源地址”).forward(req,resp);//请求转发。。
resp.sendRedirect(“url”);// 重定向
forward(转发):
客户发送一个请求到服务器,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的其他资源 。这里是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程实在服务器实现的,并不是在客户端实现的所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址。
整个过程共享同一个请求和同一个响应,即对两个资源来说请求响应里的数据是共享的.
redirect(重定向):
是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
客户发送一个请求到服务器,服务器匹配servlet,servlet处理完之后调用了sendRedirect()方法,立即向 客户端 返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问新的url,紧接着客户端收到这个请求后,立刻发出一个新的请求。这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。
可见,在sendRedirect()里面是两个请求,两个响应。(服务器向浏览器发送一个302状态码以及一个location消息头,浏览器收到请求后会向再次根据重定向地址发出请求)
转发是服务器行为,重定向是客户端行为。
两者区别:
- 请求次数:
重定向至少发出两次请求,请求转发发出一次请求;
重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址; - 地址栏显示:
重定向地址栏会发生变化,转发地址栏不会发生变化;
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址;
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL; - 数据共享:
重定向:两次请求不共享数据,
转发一次请求:转发页面和转发到的页面可以共享数据(在request级别使用信息共享,使用重定向必然出错); - 跳转限制:
重定向可以跳转到任意URL,
转发只能跳转本站点资源; - 发生行为不同:
重定向是客户端行为,
转发是服务器端行为; - 从运用地方来说
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等
forward:一般用于用户登陆的时候,根据角色转发到相应的模块. - 效率
redirect:低.
forward:高.