Java重定向和请求转发的区别
Web资源跳转的两种方式:
- 重定向(站外跳转)
- 请求转发(站内跳转)
重定向过程过程
例如:
response.sendRedirect(request.getContextPath + "/Web_B.jsp");
直接上图解释:
客户端发送一个请求到服务器端,服务器匹配Servlet,这都和请求转发一样。Servlet处理完之后调用了sendRedirect()这个方法,这个方法是response方法。所以,当这个Servlet处理完后,看到response.sendRedirect()方法,立即向客户端返回个响应,响应行告诉客户端你必须再重新发送一个请求,去访问next.jsp,紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求next.jsp,在这两个请求互不干扰、相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。因此,在sendRedirect()里面是两个请求,两个响应。
请求转发的过程
例如:
request.getRequestDispatcher("/Web_B.jsp").forward(request,response);
首先需要使用HttpServletRequest的方法获取请求转发对象 request.getRequestDispatcher("/Web_B.jsp")
在使用RequestDispatcher的方法,转发请求;
直接上图解释:
客户端首先发送一个请求到服务器,服务器匹配Servlet,并指定执行。当这个Servlet执行完后,它要调用getRequestDispacther()方法,把请求转发给指定的Web_B.jsp,整个流程都是在服务端完成的,而且是在同一个请求里面完成的。
Forward是在服务器端的跳转,就是客户端一个请求给服务器,服务器直接将请求相关参数的信息原封不动的传递到该服务器的其他jsp或Servlet去处理。而sendRedirect()是客户端的跳转,服务器会返回客户端一个响应报头和新的URL地址,原来的参数信息如果服务器没有特殊处理就不存在了,浏览器会访问新的URL所指向的Servlet或jsp,这可能不是原来服务器上的webService了。
功能应用:比如在完成注册页面后跳转到登录界面上,如此时使用的请求转发的话,用户在注册登录的界面上多次点击刷新,那么注册就会提交多提;但是如果使用重定向的话,就不会发生对此提交,因为重定向是url已经改变了,对象的request和response内容改变了。
总结:
- 转发是在服务器端完成的,重定向是在客户端发生的;
- 转发的速度快,重定向速度慢;
- 转发是同一次请求,重定向是两次请求;
- 转发地址栏没有变化,重定向地址栏有变化;
- 转发必须是在同一台服务器下完成,重定向可以在不同的服务器下完成。