【经典】请求转发和重定向的区别、路径问题

通读整篇文章,你将会学到以下知识:

一、请求转发:

二、重定向:

三、请求转发和重定向之间的区别

四、请求转发和重定向的URL路径问题


一、请求转发:

request.getRequestDispatcher(url地址).forward(request,response);

处理流程:

  1. 客户端发送请求,Servlet做出业务逻辑响应。
  2. Servlet调用forward()方法,服务器Servlet把目标资源返回给客户端浏览器,整个过程是1次访问。

小结:

        举个例子,小明去奶茶店买奶茶,他告诉奶茶店买一杯大杯珍珠奶茶,付过钱后,店员说好嘞,等过了一会。店员把奶茶给小明,小明拿到了自己想要喝的珍珠奶茶。这个过程小明并不知道这个珍珠奶茶是怎么制作的,小明这个时候只需要等待奶茶店的响应就可以了。一样的道理,浏览器发出请求给服务器,浏览器不知道服务器是怎么处理的,服务器通过后端一系列的处理后,将结果返回给浏览器。请求转发是服务器跳转。

二、重定向:

response.sendRedirect(url地址);

处理流程:

  1. 客户端发送请求,Servlet做出逻辑处理。
  2. Servlet调用reaponse.sendRedirect(url)方法,把要访问的目标资源作为response响应头信息发送给客户端浏览器。
  3. 客户端浏览器重新定向服务器端的jsp的界面,服务器再次对客户端请求进行处理做出相应。

小结:

        小明去A奶茶店买奶茶,他想买红豆奶茶,A奶茶店告诉小明,我这儿没有红豆奶茶,我知道马路对面的奶茶店B有红豆奶茶,你可以去那儿买。然后小明去了马路对面的奶茶店B,小明将自己想要红豆奶茶的信息传递给奶茶店B,奶茶店B知道并处理后,将做好的红豆奶茶响应给小明。小明拿到了自己想要的红豆奶茶。类比,浏览器发送请求到服务器,服务器寻找浏览器请求的资源,服务器发现自己没有请求的资源,这个时候服务器发送一个请求的URL(该请求就是浏览器再次访问的请求)给浏览器客户端,客户端再根据URL再访问浏览器,服务器将响应的结果返回给浏览器。整个状态浏览器请求了2次服务器。

三、请求转发和重定向之间的区别

  1. 重定向地址栏发生改变,请求转发地址栏不发生改变
  2. 重定向需要二次跳转,请求转发需要一次跳转
  3. 重定向过程参数会丢失,请求转发中的参数不会丢失
  4. 重定向可以跳转服务器以外的资源;请求转发无法跳转服务器以外的资源
  5. 重定向一次跳转返回302状态码和URL地址,请求转发直接返回的是200

    ①重定向:a、服务器之外的跳转;b、浏览器地址栏需要改变;c、跳转2次

    ②请求转发:a、服务器内跳转;b、不丢失参数信息

深入理解:

  • request.getRequestDisPatcher()是容器中控制权的转向,在客户端浏览器地址栏不会显示出转向后的地址;服务器内部转发,整个过程处于同一个请求中。
  • response.sendRedirect()则是完全的跳转,浏览器会得到跳转的地址,并重新发送请求连接。这样浏览器的地址栏中会看到跳转后的地址,不在同一个请求域中。所以请求转发存取可以用request作用域:request.setAttribute(),request.getAttribute(),重定向只能使用session域,关于session/cookie详解:请转到 https://blog.csdn.net/Sunshineoe/article/details/1092881
  • RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,属于请求对象的方法。
  • sendRedirect()是HttpServletResponse对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程结束了,服务器开始向客户端返回执行的结果。
  • 重定向是跨域访问,而转发是web服务器内部进行的,不能跨域访问。 
  • 重定向可以访问自己web应用以外的资源。在重定向的过程中,2次请求,传输的信息会被丢失,路径被丢失,所以路径每次要全,加上上下文根路径。
  • 请求转发对于客户端而言,只有一次请求,服务器内部怎么处理并不知道,传输的信息不会丢失。

四、请求转发和重定向的URL路径问题

   在重定向的过程中,2次请求,传输的信息会被丢失,路径被丢失,所以路径每次要全,加上上下文根路径。

   所以重定向的路径是response.sendRedirect(request.getContextPath()+"/show.jsp");

   请求转发对于客户端而言,只有一次请求,服务器内部转发跳转,传输的信息不会丢失。

   所以请求转发的路径是:request.getRequestDisPatcher("/show.jsp")

五、总结

  1. 总结下来,感觉又学到了一些新的东西,对知识更加系统。坚持!
  2. 如果觉得对你有帮助,点个赞啦,谢谢!

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值