请求转发和重定向的区别
什么是请求转发(request.getRequestDispatcher(目标).forward(request,response))
请求转发是服务器将请求转发给别的servlet处理,是服务器内部的行为
1、请求转发的过程
客户端向服务器发送请求,服务器将请求指派给一个servlet处理(命名为A),A处理后发现自己处理不了该请求,就调用request.getRequestDispatcher(目标).forward(request,response)方法将请求转发给servlet(B)让B处理,B处理成功后将结果返回给客户端。
特点
1、转发是在服务器端完成的,与客户端无关
2、转发是同一次请求,无论服务器端转发多少次都只有一次请求
3、转发的客户端地址栏不会变化,无论最后响应的是哪个servlet地址栏都不会改变
4、转发必须在同一台服务器下完成,是服务器内部行为
什么是重定向(response.sendredirect(URL))
是通过各种方法将请求重新定个方向转到其它位置
重定向过程
客户端发送一个请求到服务器,服务器匹配Servlet,这都和请求转发一样。Servlet处理完之后调用了response.sendRedirect()方法。当这个Servlet处理完后,看到response.sendRedirect()方法,立即向客户端返回个响应,响应行告诉客户端你必须再重新发送一个请求,去访问另一个目标,客户端收到这个请求后,立刻发出一个新的请求,去请求重定向后的目标,在这两个请求互不干扰、相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。因此,在sendRedirect()里面是两个请求,两个响应。
特点
1、重定向是在客户端发生的;
2、重定向是两次或以上请求;
3、重定向地址栏有变化;
4、重定向可以在不同的服务器下完成。
重定向和请求转发的区别
序号 | 问题 | 重定向 | 请求转发 |
---|---|---|---|
1 | 行为发生在什么地方? | 浏览器 | 服务器servlet |
2 | 浏览器发送了几次请求? | 2次及以上 | 1次 |
3 | servlet可以共享request吗? | 不可以 | 可以 |
4 | 浏览器地址栏是否发生了改变? | 改变了 | 没有改变 |
5 | 浏览器地址栏显示的哪一次访问地址? | 最后一次 | 第一次 |
6 | 可以跳转到什么资源? | 任意资源(包括其他的服务器) | 项目内部(本服务器内) |