概述
大家好,我是路人,这是 SpringMVC 系列第 29 篇。
1、本文内容 3 个知识点
SpringMVC 中转发如何实现?
SpringMVC 重定向如何实现?
重定向 3 种传参方式
2、转发
2.1、servlet 原生实现转发
request.getRequestDispatcher(path).forward(request,response);
2.2、SpringMVC 实现转发
接口需满足下面这 3 条的会被 SpringMVC 当做转发进行处理
接口返回值为 String 类型
返回值格式:
forward:转发的路径
方法或者类上不要标注@ResponseBody 注解
案例代码如下,当访问/forward/test1
的时候,返回值以forward:
开头,SpringMVC 会将请求转发到/forward/test2
@RequestMapping("/forward/test1")
public String test1() {
return "forward:/forward/test2";
}
@RequestMapping(value = "/forward/test2", produces = "text/html;charset=UTF-8")
@ResponseBody
public String test2() {
return "我是test2";
}
测试效果:浏览器中访问/forward/test1
输出
3、重定向
3.1、servlet 原生实现重定向
response.sendRedirect(url);
3.2、SpringMVC 实现重定向
接口需满足下面这 3 条的会被 SpringMVC 当做转发进行处理
接口返回值为 String 类型
返回值格式:
redirect:重定向的路径
方法或者类上不要标注@ResponseBody 注解
案例代码如下,当访问/redirect/test1
的时候,返回值以redirect:
开头,SpringMVC 会将请求转发到/redirect/test2
@RequestMapping("/redirect/test1")
public String test1() {
return "redirect:/redirect/test2";
}
@RequestMapping(value = "/redirect/test2", produces = "text/html;charset=UTF-8")
@ResponseBody
public String test2() {
return "我是test2";
}
测试效果:浏览器中访问/redirect/test1
,效果如下,浏览器地址栏变成/redirect/test2
了
3.3、重定向传参方式 1:手动在地址后拼接参数
直接在重定向的 url 中直接拼接参数,如redirect:地址?name=路人&age=30
,如
@RequestMapping("/redirect/test1")
public String test1() {
return "redirect:/redirect/test2?name=路人&age=30";
}
3.4、重定向传参方式 2:RedirectAttributes.addAttribute("参数","值")
用法
接口中需要有一个类型为
RedirectAttributes
的参数调用
redirectAttributes.addAttribute("参数","值")
,放入重定向需要传递的参数**原理:**通过
redirectAttributes.addAttribute
丢进去的参数,SpringMVC 重定向的时候,会自动将这些参数以?参数1=值1&参数2=值2
拼接到重定向的地址上,类似于上面的方式 1。
案例代码
访问接口 test3,会被重定向到 test4,顺便传递了 2 个参数
@RequestMapping("/redirect/test3")
public String test3(RedirectAttributes redirectAttributes) {
redirectAttributes.addAttribute("name", "路人");
redirectAttributes.addAttribute("age", 30);
return "redirect:/redirect/test4";
}
@RequestMapping(value = "/redirect/test4", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Map<String, Object> test4(@RequestParam("name") String name, @RequestParam("age") int age) {
Map<String, Object> result = new LinkedHashMap<>();
result.put("name", name);
result.put("age", age);
return result;
}
测试效果
浏览器中访问/redirect/test3
接口,会被重定向到/redirect/test4
,效果如下,test3 方法中丢到addAttribute
中的 2 个参数name
和age
,被自动拼接到地址后面了。
3.5、重定向传参方式 2:RedirectAttributes.addFlashAttribute("参数","值")
上面我们使用的是RedirectAttributes
的addAttribute
放入参数,这次我们要使用另外一个方法addFlashAttribute
放入重定向需要传递的参数,具体有什么区别呢,请向下看。
用法
接口中需要有一个类型为
RedirectAttributes
的参数调用
redirectAttributes.addFlashAttribute("参数","值")
,这种方式传递的参数是被隐藏的,不会被拼接在地址后,内部是通过 session 共享数据来实现的。被重定向到的接口,需要使用一个
org.springframework.ui.Model
或者org.springframework.ui.ModelMap
类型的参数来接收传递过来的参数,调用model.getAttribute("参数名")
可以获取传递过来的参数
案例代码
访问接口 test5,会被重定向到 test6,顺便传递了 2 个参数
@RequestMapping("/redirect/test5")
public String test5(RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("name", "路人");
redirectAttributes.addFlashAttribute("age", 30);
return "redirect:/redirect/test6";
}
/**
* 需要使用一个org.springframework.ui.Model或者org.springframework.ui.ModelMap类型的参数来接收传递过来的参数,
* 方法内部调用model.getAttribute("参数名")可以获取传递过来的参数
*
* @param model
* @return
*/
@RequestMapping(value = "/redirect/test6", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Map<String, Object> test6(Model model) {
String name = (String) model.getAttribute("name");
Integer age = (Integer) model.getAttribute("age");
Map<String, Object> result = new LinkedHashMap<>();
result.put("name", name);
result.put("age", age);
return result;
}
测试效果
浏览器中访问/redirect/test5
接口,会被重定向到/redirect/test6
,效果如下,参数传递成功了,传递是隐藏式的。
原理
redirectAttributes.addFlashAttribute 放入重定向需要传递的参数,SpringMVC 在重定向到新地址之前,会将这部分数据丢到 session 中,当重定向的请求过来后,SpringMVC 又会从 session 中拿到这部分数据,然后丢到 Model 或者 ModelMap 中,然后冲 session 中清理掉这部分数据。
3.6、RedirectAttributes.addAttribute 和 RedirectAttributes.addFlashAttribute 区别
都可以实现重定向传递参数
addAttribute 传递的参数,最后会追加在新的地址上,而 addFlashAttribute 传递的参数是隐藏式的
addFlashAttribute 可以传递大量的信息,不过 addFlashAttribute 有个弊端,重定向到新地址之后,如下图,如果此时用户刷新页面,传递的参数取不到了,就丢失了,建议使用方式 1 和方式 2;方式 3 可以作为了解。
4、案例代码 git 地址
4.1、git 地址
https://gitee.com/javacode2018/springmvc-series
4.2、本文案例代码结构说明
5、SpringMVC 系列目录
SpringMVC 系列第 1 篇:helloword
SpringMVC 系列第 2 篇:@Controller、@RequestMapping
SpringMVC 系列第 3 篇:异常高效的一款接口测试利器
SpringMVC 系列第 4 篇:controller 常见的接收参数的方式
SpringMVC 系列第 5 篇:@RequestBody 大解密,说点你不知道的
SpringMVC 系列第 6 篇:上传文件的 4 种方式,你都会么?
SpringMVC 系列第 7 篇:SpringMVC 返回视图常见的 5 种方式,你会几种?
SpringMVC 系列第 8 篇:返回 json & 通用返回值设计
SpringMVC 系列第 9 篇:SpringMVC 返回 null 是什么意思?
SpringMVC 系列第 10 篇:异步处理
SpringMVC 系列第 11 篇:集成静态资源
SpringMVC 系列第 12 篇:拦截器
SpringMVC 系列第 13 篇:统一异常处理
SpringMVC 系列第 14 篇:实战篇:通用返回值 & 异常处理设计
SpringMVC 系列第 15 篇:全注解的方式 & 原理解析
SpringMVC 系列第 16 篇:通过源码解析 SpringMVC 处理请求的流程
SpringMVC 系列第 17 篇:源码解析 SpringMVC 容器的启动过程
SpringMVC 系列第 18 篇:强大的 RequestBodyAdvice 解密
SpringMVC 系列第 19 篇:强大的 ResponseBodyAdvice 解密
SpringMVC 系列第 20 篇:RestFull 详解
SpringMVC 系列第 21 篇:接口调用过利器 RestTemplate
SpringMVC 系列第 22 篇:参数解析器 HandlerMethodArgumentResolver 解密
SpringMVC 系列第 23 篇:@RequestParam 用法及原理详解
SpringMVC 系列第 24 篇:@RequestBody 用法及原理详解
SpringMVC 系列第 25 篇:@RequestHeader 用法及原理详解
SpringMVC 系列第 26 篇:@CookieValue 用法及原理详解
SpringMVC 系列第 27 篇:@RequestAttribute 详解
SpringMVC 系列第 28 篇:@SessionAttribute 详解
6、更多系列文章
Spring 高手系列(共 56 篇)
Java 高并发系列(共 34 篇)
MySql 高手系列(共 27 篇)
Maven 高手系列(共 10 篇)
Mybatis 系列(共 12 篇)
聊聊 db 和缓存一致性常见的实现方式
接口幂等性这么重要,它是什么?怎么实现?
泛型,有点难度,会让很多人懵逼,那是因为你没有看这篇文章!
7、最新资料
尚硅谷 Java 学科全套教程(总 207.77GB)
2021 最新版 Java 微服务学习线路图 + 视频
阿里技术大佬整理的《Spring 学习笔记.pdf》
阿里大佬的《MySQL 学习笔记高清.pdf》
2021 版 java 高并发常见面试题汇总.pdf
Idea 快捷键大全.pdf
最后
以上就是怡然星月为你收集整理的SpringBoot中转发和重定向解密,这 3 点你会么?的全部内容,希望文章能够帮你解决SpringBoot中转发和重定向解密,这 3 点你会么?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复