文档章节

RedirectAttributes

李永china
 李永china
发布于 2016/06/20 23:20
字数 912
阅读 45
收藏 1

很久没发过技术贴了,今天对于一个问题纠结了2小时,遂放弃研究用另一种方法解决,奈何心中一直存在纠结,发帖求解

我先解释下什么是RedirectAttributes

RedirectAttributes是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的
他有两种带参的方式:
第一种: 
attr.addAttribute("param", value);  
这种方式就相当于重定向之后,在url后面拼接参数,这样在重定向之后的页面或者控制器再去获取url后面的参数就可以了,但这个方式因为是在url后面添加参数的方式,所以暴露了参数,有风险
例:

Java code?

1

2

3

attr.addFlashAttribute("name""123");  

attr.addFlashAttribute("success""success");

return "redirect:/index";


这样就相当于:return "redirect:/index?name=123&success=success"

第二种: 
attr.addFlashAttribute("param", value);
这种方式也能达到重新向带参,而且能隐藏参数,其原理就是放到session中,session在跳到页面后马上移除对象。所以你刷新一下后这个值就会丢掉
例:

Java code?

1

2

3

attr.addFlashAttribute("status","999");

attr.addFlashAttribute("message","登录失败");

return "redirect:/toLogin";


这种方式确实能重定向带参,但是有个问题,这个只能重定向到页面上,也就是说重定向的这个 页面视图,能用el表达式直接获取你带参的值,比如status 和message ,都能获取。 可是我重定向到另一个Controller的时候,这 个控制器里面没法获取这两个参数

我现在有个需求:登录成功,直接重定向其他页面,登录失败,又得重定向到登录页面,直接return的还不行,但是又要带状态码和提示等参数,所以想到用 RedirectAttributes的addFlashAttribute 方式。但是重定向到/toLogin这个控制器里面的时候,获取不到 addFlashAttribute 当初添加的属性。

具体事例:


Java code?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

               //通过直接获取getFlashAttributes的map,然后获取带参,但是获取不到

        Map<String, String> map=(Map<String, String>) attr.getFlashAttributes();

        System.out.println(map.get("status"));

        System.out.println(map.get("message"));

         

        //addFlashAttribute 即将flashAttribute属性添加到request的OutputFlashMap中,以被重定向后的request获取

        //所以我通过获取OutputFlashMap的方式来取值,却发现maps不为空,但是里面的参数没有

        Map<String, Object> maps=RequestContextUtils.getOutputFlashMap(request);

        System.out.println(maps.get("status"));

        System.out.println(maps.get("message"));

         

        //因为OutputFlashMap和InputFlashMap  都是由FlashMapManager来管理的

        //对于每一次请求一个 “input” flash map 会被创建,来存储来自任何之前请求的

        //flash attribute 还有一个 “output” flash map 会被创建,来存储任何我们存储在这个请求中的,之后的请求参数

        //这里我获取getInputFlashMap,看看能不能获取到参数,但是还是map2直接为null

        Map<String, String> map2=(Map<String, String>)RequestContextUtils.getInputFlashMap(request);

        System.out.println(map2.get("status"));

        System.out.println(map2.get("message"));


查了很多资料,包括看了spring mvc的官方文档,对于这个重定向之后参数怎么获取都没有什么明确的解释
包括上述三种方式,包括我直接获取参数的方式都不行,于是放弃了RedirectAttributes来传参


最后还是用session来解决,重定向之前设置session,重定向之后拿值移除session。

效果是做完了,但是心里一直纠结这个,所以发帖,看看各位能不能用RedirectAttributes的addFlashAttribute 方式,并且在另一个控制器里面获取这个添加的参数值

看在我光写这个帖子就花了这么久的份上,希望能得到答案...

本文转载自:http://bbs.csdn.net/topics/391034118?page=1

李永china
粉丝 12
博文 233
码字总数 174289
作品 0
朝阳
高级程序员
私信 提问
加载中

评论(1)

osc皮皮
osc皮皮
model.addAttribute("error", error);
Spring Mvc 请求转发和重定向

spring mvc controller间跳转 重定向 传参 需求背景 本来以为挺简单的一件事情,并且个人认为比较常用的一种方式,一百度全都有了,这些根本不是问题,但是一百度居然出乎我的意料,一堆都不...

小风89
2015/09/29
85
0
spring mvc 请求转发和重定向

spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景 需求:spring MVC框架controller间跳转,需重定向。有几种情...

Carl_
2015/09/21
64K
1
整了一天的SpringMVC 3.1

其实之前使用过SpringMVC 3.0做过一个实验项目,发现很多问题,最明显的就是与Validation的问题,并没有考虑到分组校验,再者,就是FlashMessage实现的问题,这个得自己写,这个我确实花了一...

kut
2012/01/14
1K
0
shiro 权限的怪癖想法

@江南白衣 你好,想跟你请教个问题: 看到你的springside里面的shiro权限应用,我结合我自己的想法,碰到了如下的门槛: 列举一个你以前的mini-web中的权限例子如下: 1。针对USER模块的 保存...

os_yun70345
2012/10/12
4.4K
3
spring mvc3中的addFlashAttribute方法

记得在spring mvc2中,当保存POJO到数据库后,要返回成功页面,如果这个时候要带点信息, 则要这样: //第三个参数(UserModel user)默认为绑定对象 @RequestMapping(value = "/user/save", ...

jackyrong
2013/02/16
140
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在Python上使用“ pip”安装psycopg2?

我正在使用virtualenv ,需要安装“ psycopg2”。 我已经完成以下工作: pip install http://pypi.python.org/packages/source/p/psycopg2/psycopg2-2.4.tar.gz#md5=24f4368e2cfdc1a2b03282......

javail
4分钟前
2
0
How to Install Java on Debian 9

In this tutorial, we will walk through installing Java on Debian 9. Java is one of the most popular programming languages used to build different kinds of applications and syste......

Ciet
8分钟前
2
0
typescript学习资料

typescript 教程 深入理解 TypeScript

IT追寻者
17分钟前
2
0
剑指Offer - 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值

题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,...

SongAlone
20分钟前
2
0
将C ++模板函数定义存储在.CPP文件中

我有一些模板代码,希望将其存储在CPP文件中,而不是内联在标头中。 我知道只要您知道将使用哪种模板类型就可以做到。 例如: .h文件 class foo{public: template <typename T> vo...

技术盛宴
20分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部