JavaWeb——请求转发与请求重定向
1、概念
请求转发:服务器行为,request.getRequestDispatcher(URL地址).forward(request,response);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。
请求重定向:客户端行为,response.sendRedirect(URL地址),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。
2、工作流程(假设只请求一次<转发/重定向>)
请求转发
①客户端发送请求数据给服务器
②服务器接收请求数据并调用第一个Servlet处理逻辑
③第一个Servlet处理完数据后将数据在服务器内部传递给下一个Servlet
④第二个servlet处理完数据后调用forward()方法将最终处理结果返回给客户端
请求重定向:
①客户端发送请求数据给服务器
②服务器接收请求数据并调用一个Servlet处理逻辑
③服务器调用sendRedirect()方法将处理结果放进HTTP响应头中并返回给客户端
④客户端收到响应结果后,从HTTP响应头中取得相关信息,再次发送请求数据给服务器。
3、路径问题
3.1.若URL地址使用相对路径,转发和重定向中没有区别。
3.2.若URL地址使用绝对路径
3.2.1.请求转发:由于转发是服务器内部行为,此时绝对路径开头的"/“指的是当前Web程序的根目录。因此若使用转发,绝对路径的写法应为”/资源名"。
“/login.jsp"或者”/servlet/LoginServlet"
3.2.2.请求重定向:由于重定向是服务器向客户端发送一个请求头信息,客户端再请求一次服务器,此时绝对路径开头的"/“指的是Tomcat服务器的根目录,因此若使用重定向,绝对路径的写法应为”/当前Web程序名称/资源名"。
“/WebModule/login.jsp"或者”/WebModule/servlet/LoginServlet"
4、转发与重定向的区别
4.1.URL地址问题
请求转发不会改变地址栏的URL地址
请求重定向会改变地址栏的URL地址
4.2.数据共享问题
请求转发的数据处理是在同一次请求中,可以使用request对象实现数据共享。
请求重定向是向服务器发送了两次请求,不能使用request对象实现数据共享,想要让两次请求数据共享必须使用session对象。
4.3.效率问题
请求转发的效率高于重定向(服务器内部的页面跳转 > 再次向服务器发送请求调用servlet完成页面跳转)
4.4.本质区别
请求转发是属于请求对象的方法(调用HttpServletRequest对象的方法)
请求重定向是属于响应对象的方法(调用HttpServletResponse对象的方法)
5、使用时机
请求转发会在每次刷新时会重新向服务器发送请求,每刷新一次,就重新发送一次请求。对于表单提交来讲,若提交表单后再重新加载页面,使用转发可能会导致信息的重复提交,因此,表单提交需要使用请求重定向
请求转发只能访问当前服务器中的某些页面,因此若要访问其他服务器上的页面,需要使用请求重定向
————————————————
版权声明:本文为优快云博主「Ambition小啊潇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_43490440/article/details/100920817