这两个我按照个人理解画了一张图,利用这张图去理解可能会好点,如有错误或不恰当之处,请及时指正,谢谢:-)
从上图可以看出重定向是游览器(客户端)行为,而内部转发是服务器行为。还有就是重定向是全程使用的是两个request,和两个response。而内部转发是使用的一个request和response。

然后关于重定向不能传参的解决办法(这个是借鉴于https://www.cnblogs.com/zhujiabin/p/4935557.html):
在springmvc3.1版本出来了一个小功能(RedirectAttributes)可以实现。有两种方式:

  1. attr.addAttribute("param", value);
  2. attr.addFlashAttribute("param", value);
    这两点的区别:
    第一个就类似于地址传参即在url后拼接参数,下面是案例:
public String demo(RedirectAttributes  attr) {attr.addAttribute("name", "123");attr.addAttribute("success", "success");return "redirect:/index";
}

上面的代码等同于:

public String demo() {return "redirect:/index?name=123&success=success"
}

这种方式的风险在于参数直接暴露在地址栏了。

第二种的原理是通过将参数放置在session中,达到传参并隐藏参数的目的。但是好像会在跳转到页面后会移除这个对象,即刷新后这个参数就会丢失。

另外,对于什么时候使用重定向还是内部转发:

  • 访问的路径是web应用外部时,只能使用重定向
  • 访问的路径时web应用内部时,可根据需要选择,毕竟重定向会改变地址栏,而内部转发地址栏是不会变化的,且虽说springmvc现在出了重定向带参的功能,但是目前需要传参时还是建议使用转发。可能有一些情况必须得使用重定向而不是内部转发,后面遇到会补充,如果看到此处的兄弟碰到过这种情况,希望您留言一下,我好补充一下哈哈。

补充

1

目前在写SpringBoot博客时,发现了一个问题,我使用重定向后不能访问重定向的html,只能访问到重定向后的哪个url对应的Controller,而转发只能访问html,不能访问该url对应的Controller,找了找百度和询问别人之后,emm,三个解答:

  • 我的配置出错了
  • 重定向一定不会经过视图解析器,因为请求转发的页面是在地址栏直接访问的,是一个新的请求,如果经过视图解析器,拼接后的结果就是错误的,所以重定向一定不经过视图解析器。另外WEB-INF下的所有文件必须通过请求转发才能访问。
  • 加了forward或redirect后不会拼接视图解析器的前后缀了,由于默认为转发,所以转发(不显示声明forward)可以拼接视图解析器,如果手动加了,则只会匹配Controller了,找不到就报404

个人目前感觉可能是第二个和第三个,当然第一个也有可能,在适当的配置下应该也能完成重定向访问到资源。
对于第二个我自己的理解是重定向(客户端总共两次请求)相当于又让游览器的地址栏输入了一个请求,自然不能加前缀后缀,加了就不一定是原来的请求了。所以访问的只能是地址栏中url对应的Controller。
对于第三个,我自己确实自己手动测试了,如果显式得加上forward,也会导致不会添加视图解析器的前后缀,而重定向必须显式加redirect,所以自然不会添加前后缀了。

2

还有必须使用重定向的一个地方是访问某个页面前必须进行某些操作,则得使用重定向转到其他Controller进行某些操作。

3

还有页面上的一些跳转可以视为重定向,如:

<div class="ui bottom attached segment" th:if="${page.totalPages}>1"><div class="ui middle aligned two column grid"><div class="column"><a href="#" th:href="@{/types/{id}/(id = ${activeTypeId},page=${page.page}-1)}"th:unless="${page.first}" class="ui mini teal basic button">上一页</a></div><div class="right aligned column"><a href="#" th:href="@{/types/{id}/(id = ${activeTypeId},page=${page.page}+1)}"th:unless="${page.last}" class="ui mini teal basic button">下一页</a></div></div></div>

这里的th:href="@{/types/{id}/(id = ${activeTypeId},page=${page.page}-1)}"就类似重定向,所以得加一个/,如果不加/则会导致url拼接得地址与你想要得地址不同,报404

重定向和内部转发个人见解相关推荐

  1. 内部转发和重定向区别

    内部转发和重定向区别 内部转发地址栏不会发生改变 而重定向地址栏会发生改变 重定向相当于发送了两次请求,而内部转发只有一次请求 重定向(路径)相对于tomcat服务器 ,而内部转发是相对于web应用 ...

  2. 后端学习 - JavaWeb

    技术体系 文章目录 一 HTML 1 网页的组成部分 2 HTML 概述 3 HTML 标签 4 常用标签 5 表单与表单的提交 二 CSS 1 语法格式 2 使用方法 三 JavaScript 1 ...

  3. java学习之javaWeb

    Web开发 1.CS和BS的异同点 2.Tomcat 2.1新建项目-部署-运行-访问(底层原理) 2.2在IDEA下新建javaWeb项目 3.Servlet 3.1Servlet获取参数 3.2S ...

  4. JavaWeb——Servlet详解

    文章目录 什么是Servlet? Servlet及其子类 Servlet中常用方法 init service distory Servlet的生命周期 Servlet初始化时机 钝化和活化 Http协 ...

  5. 内部转发和重定向的区别

    内部转发: 内部转发是请求从客户端发送到服务器后,请求在服务器中从一个servlet跳转到另一个servlet,是servlet根据自己底端的url访问服务器的内部资源,不涉及到客户端,此过程中客户端 ...

  6. 7.服务器内部转发以及客户端重定向

    文章目录 1 服务器内部转发 : 2 客户端重定向: 1 服务器内部转发 : request.getRequestDispatcher("-").forward(request,r ...

  7. 服务器内部转发和客户端重定向

    服务器内部转发和客户端重定向 一.服务器内部转发 二.客户端重定向 一.服务器内部转发 request.getRequestDispatcher("XXX.jsp 或者 servlet&qu ...

  8. 服务器内部转发以及客户端重定向概念的学习

    一.服务器内部转发 一次请求响应的过程,对于客户端而言,内部经过了多少次转发是不知道的. 既地址栏不会变化 二.客户端重定向 客户端向上面的组件发送请求,组件里由response.sendRedire ...

  9. 服务器内部转发以及客户端重定向

    服务器内部转发以及客户端重定向 1) 服务器内部转发 : request.getRequestDispatcher("-").forward(request,response); ...

最新文章

  1. 15 种 SQL 优化中,老司机才懂的处理技巧
  2. python使用正则表达式抽取文件中的IP地址
  3. Ubuntu安装google拼音输入法
  4. 9.Verilog端口定义以及模块例化和调用
  5. 逻辑备库的Swichover和Failover
  6. MYSQL 5.7.26 二进制版本安装
  7. 使用Linux 显示日历 cal -y (可以快速制作简易万年历)
  8. DependencyProperty
  9. 2021-07-09商场主页及分类
  10. python unittest接口测试_Python+unittest 接口自动化测试
  11. 利用FolderSync实现本地FTP备份同步
  12. css3 箭头动态效果,CSS3制作上下跳动动画箭头效果
  13. python爬虫和医学数据_【爬虫】(八)Python之爬虫和数据小解析
  14. oracle实例由,Oracle 数据库的实例由( )组成
  15. 幽默 滑稽 及 其他
  16. 从100套真题中提炼而出的100个经典句子
  17. 五面拿下阿里飞猪offer,java基础入门pdf百度云
  18. SCI期刊名缩写查询
  19. wallpaper engine怎么用?
  20. 使用jQuery与后端进行数据传输代码示例

热门文章

  1. manifest.xlm配置错误信息
  2. idea sout输出乱码的问题
  3. Matplotlib学习---用mplot3d画莫比乌斯环(Mobius strip)
  4. vue项目中postMessage的使用总结
  5. _variant_t、CComVariant与COleVariant、CDBVariant
  6. 五子棋(人机)-只算杀棋
  7. 六月份优秀Android开源库整理推荐
  8. 美国计算机专业大学排名世界,美媒发布全球计算机专业排名,中国三高校入选全球前十,清华居首!...
  9. 【学习总结】如何提高学习效率
  10. vue页面实现拨打电话功能