forward()与sendRedirect()区别
说明:forward()就是转发。sendRedirect就是重定向。两者最大的区别其实是,forward()传输不会改变地址,不能在传输参数,只能在代码中设置参数;而sendRedirect是跳转到指定的url地址,会改变地址栏上的信息,且可以传递参数,例如:index?name=*。
也就是说:forward()仅是服务器端转发请求,sendRedirect()则是客户端浏览器重定向。
最直观的区别:浏览器发出请求响应后,如果浏览器地址栏的地址改变,则是间接的请求转发(即:sendRedirect方式);否则是直接转发请求。
具体讲解:
1、forward方法的调用者与被调用者之间共享Request和Response。
原理:使用forward重定向的过程,是浏览器先向目的的Servlet发送一次Rquest请求,然后再服务器段由Servlet再将请求发生发送到目的url,再由服务端Servlet返回Reponse到浏览器。浏览器和服务端一次请求响应。
用途:Web应用程序大多会有一个控制器。由控制器来控制请求应该转发给那个信息资源。然后由这些信息资源处理请求,处理完以后还可能转发给另外的信息资源来返回给用户,这个过程就是经典的MVC模式。
代码:
...... //Servlet里处理get请求的方法,RequestDispatcher类的forward()方法 public void doGet(HttpServletRequest request , HttpServletResponse response){ //获取请求转发器对象,该转发器的指向通过getRequestDisPatcher()的参数设置 RequestDispatcher requestDispatcher =request.getRequestDispatcher("资源的URL"); //调用forward()方法,转发请求 requestDispatcher.forward(request,response); } ......
过程展示:
解释:
- 浏览器向Servlet1发出访问请求;
- Servlet1调用forward()方法,在服务器端将请求转发给Servlet2;
- 最终由Servlet2做出响应。
参数传递
request.setAttribute(“参数名称”,参数内容);
代码解释:
- request.getRequestDispatcher(url).forward(request,response)
直接将请求转发到指定的URL,所以该请求能够直接获得上一个请求的数据,也就是说采用请求转发,request对象始终存在,不会重新创建。
2、sendRedirect方法由于两次浏览器服务器请求,所以有两个Request和Response。
原理:使用sendRedirect转发的过程,浏览器先向目的Servlet发送一次请求,Servlet看到sendRedirect将目的url返回到浏览器,浏览器再去请求目的url,目的url再返回reponse到浏览器。浏览器和服务器两次请求响应。
用途:
一般用于避免用户的非正常访问。例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。
代码:
...... //Servlet中处理get请求的方法,HttpServletRequest类的sendRedirect()方法 public void doGet(HttpServletRequest request,HttpServletResponse response){ //请求重定向到另外的资源 response.sendRedirect("资源的URL"); } ........
过程展示:
解释:
- 浏览器向Servlet1发出访问请求;
- Servlet1调用sendRedirect()方法,将浏览器重定向到Servlet2;
- 浏览器向servlet2发出请求;
- 最终由Servlet2做出响应。
代码解释:
1.而response.sendRedirect(url) 会新建request对象,所以上一个request中的数据会丢失。
redirect会首先发一个response给浏览器,浏览器收到这个response后再发一个request给服务器,然后服务器新的response给浏览器,这时的页面收到的request是一个新从浏览器发来的。
参数传递
传递参数只有在url后加参数,如url?id=1。
参考:
https://www.cnblogs.com/selene/p/4518246.html
https://blog.****.net/baidu_16859039/article/details/49208011