一句话先记清楚
转发是服务器行为,重定向是前端浏览器行为
从Java代码层面分析
在文章Servlet如何将Java代码逻辑变成网络URL中分析了Servlet如何处理逻辑,在doGet/doPost的函数里会有两个参数
- HttpServletRequest:request会被服务器接收,进行逻辑处理
- HttpServletResponse:逻辑的结果会被放入response,返回给前端
那么我们看重定向和转发的代码
1 | request.getRequestDispatcher().forward(); <==== 转发是request里的功能 |
所以说转发是服务器接收的request里的函数,服务器本身就完成了,而重定向是将需要重定向的地址放入response返回给前端让浏览器自己完成
转发可以传递参数,而重定向不能传递参数
重定向 :
其实是两次request,第一次,客户端request,A服务器响应,并response回来,告诉浏览器,你应该去B,在重定向的过程中,传输到A的request信息会被丢失,因为两次request是独立的
请求转发 :
服务器内部把对一个request/response的处理权,移交给另外一个,对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。传输的信息不会丢失。