一、请求转发
是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程实在服务器实现的,并不是在客户端实现的所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址。
二、重定向
是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是新的URL。
转发是服务器行为,重定向是客户端行为。
三、请求转发与重定向的区别
1. 处理方式:
- 请求转发是服务器内部的操作。当一个Servlet通过调用
request.getRequestDispatcher().forward(request, response)
来请求转发时,请求将直接发送给目标Servlet,目标Servlet的处理结果会被发送回给客户端,但客户端并不知道请求发生了转发,它仍然认为只是与初始URL打交道。 - 重定向是通过向客户端返回一个特殊的HTTP响应码来实现的,通常是
HTTP 302 Found
。这会告诉客户端浏览器重新发送一个新的请求,客户端会发起一个新的请求去访问重定向的URL,因此在客户端浏览器中,URL会改变为重定向的URL。
2. URL改变:
- 请求转发不会改变浏览器的URL,因为它在服务器内部进行,客户端并不知道请求发生了转发,仍然保持原来的URL。
- 重定向会改变浏览器的URL,因为客户端会收到一个新的URL作为响应,然后发起新的请求访问这个URL。
3. 数据共享:
- 请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个
Request
请求对象和一个Response
响应对象,所以整个请求过程中,请求和返回的数据是共享的; - 而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的。
4. 请求次数
- 请求转发是一次请求一次响应
- 重定向是两次请求两次响应
5. 适用场景:
- 请求转发通常用于将请求传递给同一个Web应用程序内的另一个Servlet或JSP页面,以实现模块化和代码重用。
- 重定向通常用于将请求发送到另一个Web应用程序,或者用于在请求处理后重定向到另一个页面,比如处理表单提交后的重定向,以防止用户重复提交表单数据。
总结
总体来说,请求转发在服务器内部完成,效率较高,适用于在同一Web应用程序内部进行组件间的数据交互;而重定向则是通过客户端重新发起请求来实现的,适用于跨域或不同Web应用程序之间的请求处理和页面跳转。选择使用哪种技术取决于你的具体需求和场景。
- 重定向: 仅仅只是地址调整,不传递数据
- reposne对象
- 地址发送改变,并且不能带回数据。
- 两次请求,两次响应
- 请求转发:需要数据传递时
- request对象
- 地址不改变,可以传递数据
- 一次请求,一次响应