重定向和转发的分析与理解

一、重定向和转发的区别

NO 比较项目 重定向 转发
1 关键字 redirect forward
2 地址栏URL 会变 不会变
3 请求次数 至少2次请求 1次请求
4 跳转速度 较慢 较快
5 哪一端行为 客户端行为 服务端行为
6 信息传递 转发2次信息不会丢失 重定向2次信息会丢失
7 跨程序访问资源 不可

重定向和转发的区别,几乎是java web的入门知识。不管是刚毕业的学生或者经过培训刚出来的新人,基本都能倒背如流。但是,针对上面的每一点,或者两者的适用场合,如果要细究,恐怕少有人能说得很完整。

二、理解与分析


​ 转发图示

​ 重定向图示

以上两张图示可以表示转发和重定向的流程。以一个现实中的实例来说明两者的区别:

转发:张三去问李四一个java技术问题,李四一知半解,然后去问了王五,得知问题的答案后,李四再向张三解答该问题。这个过程中,张三只问了一次,也只得到了一次答复。

重定向:张三去问李四一个java技术问题,李四不会,然后告诉张三,"我不会,王五会,你去找他,他的地址是xxx"。然后张三去找王五,王五解答了该问题。这个过程中,张三问了两次,得到了两次答复(一次李四的答复,一次王五的答复)。

其实从不管从图示,还是现实中的实例来看,基本能够理解重定向和装发的区别的含义了。例如:由于重定向访问了两次服务器以及得到两次应答,转发都只有一次。其性能必然会比转发要低;重定向URL地址会变,转发地址栏不会变等。

三、选择与场景

重定向和转发,不管是去理解它、去分析它或者要弄懂两者之间的差别,都只是为了在合适的场景选择合适的方式。

  1. 重定向。

    ​ 我们先来说说重定向的优点。重定向可以防止重新加载页面时执行了相同的动作(调用了相同的接口)

    ​ 例如,当提交表单的时候,执行保存的方法将会被调用,并执行相应的动作,数据入库。但是如果在提交表单后,重新加载页面,执行保存的方法就很有可能再次被调用。同样的产品信息就将可能再次入库,为了避免这种情况,提交表单后,你可以将用户重定向到一个不同的页面(例如列表页面)。

    ​ 再来谈谈重定向的缺点。重定向有一个不方便的地方,就是经过了客户端,值容易丢失,不方便传入目标页面。不过在新版的spring(3.1)框架中,已经通过RedirectAttributes(该接口继承了Model接口)接口解决了数值丢失的问题。使用方法与Modal接口类似:

    attributes.addFlashAttribute("response",response);
    

    然后在目标页面接收该值。

    ​ 另一方面,不同web程序之间的访问,必须要用重定向。

  2. 转发。

    ​ 其实说完重定向的优点和缺点,我们大概就知道了什么时候有那个转发的方式进行页面跳转了——除了以上必须用重定向的场景,其余的场景能有转发就用转发。而转发可以用Modal(这个接口在spring2.5.1时就有了)这个接口很方便携带参数到目标页面。

四、在SpringBoot中的使用

重定向和转发在SpringBoot+thymeleaf中使用如下:

return "forward:/dashboard.html"; // 转发
return "redirect:/main.html"; // 重定向

另外,区分通过thymeleaf模板引擎解析跳转到响应的HTML页面:

return "dashboard";

作者:追梦1819
来源:博客园
原文:https://www.cnblogs.com/yanfei1819/p/10540401.html
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-03-16 00:47  追梦1819  阅读(1499)  评论(0编辑  收藏  举报