首页 > 其他分享 >重定向和转发的区别

重定向和转发的区别

时间:2022-08-19 21:11:56浏览次数:58  
标签:重定向 请求 区别 URL request 转发 forward RequestDispatcher

 

/*
*作者:呆萌老师
*☑csdn认证讲师
*☑51cto高级讲师
*☑腾讯课堂认证讲师
*☑网易云课堂认证讲师
*☑华为开发者学堂认证讲师
*☑爱奇艺千人名师计划成员
*在这里给大家分享技术、知识和生活
*各种干货,记得关注哦!
*vx:it_daimeng
*/

  

重定向

 A向B发送请求,想让B帮忙完成一项工作,当B接收到请求后发现自己无法完成,就立即告诉A情况,并向A推荐C可以完成这项任务,于是A就找C帮忙,C最终完成这项工作,返回结果给A.

方式1:

String path= request.getContextPath();

response.setStatus(302); //重定向

response.setHeader("location", path+"/servlet/TestServlet");

方式2:          

response.sendRedirect(path+"/servlet/TestServlet");

           

        

转发

      A向B发送请求,想让B帮忙完成一项工作,当B接收到请求后发现自己完成不了,于是B请C帮忙,C接收到B的请求后最终完成了该项工作,并把最后的结果返回给A.此过程中A只发送了一次请求给B,至于 B是怎么完成的A并不关心,他只等待最终的结果.

 

方法:

request.getRequestDispatcher("/index.jsp?aa=2").forward(request, response)

request.getRequestDispatcher("/servlet/TestServlet").forward(request, response);

 

RequestDispatcher实例对象是由Servlet引擎创建的,它用于包装一个要被其他资源调用的资源(例如,Servlet、HTML文件、JSP文件等),并可以通过其中的方法将客户端的请求转发给所包装的资源。

RequestDispatcher接口中定义了两个方法:forward方法和include方法。

forward和include方法接收的两个参数必须是传递给当前Servlet的service方法的那两个ServletRequest和ServletResponse对象,或者是对它们进行了包装的ServletRequestWrapper 或ServletResponseWrapper对象。

获取RequestDispatcher对象的方法:

ServletContext.getRequestDispatcher (参数只能是以“/”开头的路径)

ServletContext.getNamedDispatcher

ServletRequest.getRequestDispatcher (参数可以是不以“/”开头的路径)

 

 

重定向和转发的区别:

RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。

 

转发可以保留请求对象,重定向则不能保留

 

如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。

 

调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

 

HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。

 

5.RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。

 

怎么选择重定向还是转发:

   通常情况下,转发更快,而且能保持request内的对象。所以他是第一选择。但是由于在转发之后,浏览器中url仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果不想这样,则选择重定向。

 

标签:重定向,请求,区别,URL,request,转发,forward,RequestDispatcher
From: https://www.cnblogs.com/daimenglaoshi/p/16603317.html

相关文章

  • null 和 undefined的区别 ?
    undefined(未定义)可理解为"缺少值",即此处应该有值,却没有定义;转为数值为NaN变量被声明但没有赋值,就等于undefined调用函数时,该传的参数没有传,该参数为undefined......
  • 200(强缓存)和304(协商缓存)的区别
    200(强缓存)和304(协商缓存)的区别 本文原链接:https://my.oschina.net/ososchina/blog/494074https://blog.csdn.net/zl399615007/article/details/84534884强制缓存(2......
  • AXI3到AXI4的变化/区别(转)
    记录一下AXI3到AXI4的变化。当被问到类似问题时,我脑中只有突发长度不同和取消写乱序两个点,实际上还有很多不同的变化和特性更变。引用源:AXI3与AXI4区别与互联 ......
  • get和post请求的区别
    get请求是将请求的参数直接拼接在url上,安全性较低且请求的数据类型只能为字符串类型,一次性能请求的字符长度是有限的(通俗来讲是2kb可以设置)。post的请求数据隐藏在报文中......
  • restcontroller和controller区别
    @RestController和@Controller注解RestController的作用相当于Controller加ResponseBody共同作用的结果,但采用RestController请求方式一般会采用Restful风格的形式。Cont......
  • logback、log4j、slf4j三者区别
    作为开发运维人员,对于服务器,日志这些内容想必都不陌生吧1、整体介绍slf4j(SimpleloggingFacadeforJava)简单日志门面,日志系统的实现进行了具体的抽象化,只提供了统......
  • @Transactional注解加不加 rollbackFor = Exception.class 的区别
    先上结论:1.@Transactional只能回滚RuntimeException和RuntimeException下面的子类抛出的异常不能回滚Exception异常2.如果需要支持回滚Exception异常请用@Transactio......
  • Python小整数池-小数据池-驻留机制-is和==区别
    Python小整数池-小数据池-驻留机制-is和==区别1.is和==的区别相同点:都用来比较两个对象是否一样不同点:is用来比较是否是同一个对象,即对象的物理地址是否相同(id(......
  • C# AppDomain.CurrentDomain.BaseDirectory与Application.StartupPath的区别
    AppDomain.CurrentDomain.BaseDirectory返回结果为::D:\mycode\,而Application.StartupPath返回结果为:D:\mycodeApplication.StartupPath只能用于WinForm窗体中,而AppDom......
  • JQuery对象和JS对象区别与转换和JQuery事件绑定&入口函数&样式控制
    JQuery对象和JS对象区别与转换JQuery对象在操作时,更加方便。JQuery对象和js对象方法是不通用的两者相互转换JQuery-->js : JQuery对象[索引] 或者 JQuery对......