SpringMVC中的FlashMap
2019-01-17 本文已影响0人
SouthLight_Lin
我们都知道,重定向时一般都是不传数据的,如果一定要传数据,只能在URL中拼接字符串来传递,但是通过拼接字符串有缺点,比如长度问题,安全问题
那有没有什么方法能做到隐藏传送呢?
答案就是SpringMVC中的FlashMap!
在SpringMVC中,每次请求都会走到DispatcherServlet的service方法中(因为重写了HttpServlet的service方法)
当进入service方法后,有趣的事情来了:
Spring会先判断目前这个请求request中的FlashMap会不会等于null
// 每次处理请求时,都会先判断一下FlashMap中是否有数据
// 如果有就先设置到 inputFlashMap里面,也就是保存上次转发过来的属性
// 再设置到Model里面
FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
if (inputFlashMap != null) {
request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
}
如果不为空,就代表前一次请求(一般是重定向)中有设置参数,就把这些参数存进现在的FlashMap中
request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
这样的话请求中就带有上一个重定向传过来的参数了!!
SpringMVC中使用redirect传递参数的三种方法:
public String test(RedirectAttributes attr){
//第一种,使用RequestContextHolder获得FlashMap
// ((FlashMap)((ServletRequestAttributes)(RequestContextHolder.getRequestAttributes())
// .getAttribute(DispatcherServlet.OUTPUT_FLASH_MAP_ATTRIBUTE)
// emm..第一种忘了怎么写了
// 第二种
attr.addFlashAttribute("userName", "SouthLight-Lin");
// 第三种,直接拼接在URL中,不会被隐藏
attr.addAttribute("local", "zh-cn");
return null;
}