`
不能跑就走
  • 浏览: 71332 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

重定向和转发的区别

    博客分类:
  • J2EE
阅读更多
一直模模糊糊的,今天做个总结,搞清楚。
区别:

区别一:
  重定向时浏览器上的网址改变

  转发是浏览器上的网址不变

区别二:

  重定向实际上产生了两次请求

转发只有一次请求

重定向:

  发送请求 -->服务器运行-->响应请求,返回给浏览器一个新的地址与响应码-->浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址-->服务器运行-->响应请求给浏览器

转发:

  发送请求 -->服务器运行-->进行请求的重新设置,例如通过request.setAttribute(name,value)-->根据转发的地址,获取该地址的网页-->响应请求给浏览器

区别三:

  重定向时的网址可以是任何网址

  转发的网址必须是本站点的网址

详解:

  重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
    转  发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

1.RequestDispatcher.forward()
   是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()转发至b.jsp,此时form提交的所有信息在b.jsp都可以获得,参数自动传递.
  但forward()无法转发至有frame的jsp文件,可以转发至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面. 通常在servlet中使用,不在jsp中使用。
2.response.sendRedirect()
   是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.

最后:
(1).Request Dispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
(2).response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。
前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法.
   重定向后在浏览器地址栏上会出现重定向页面的URL
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics