SpringMVC中的FlashMap

我们都知道,重定向时一般都是不传数据的,如果一定要传数据,只能在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;
    }

你可能感兴趣的:(SpringMVC中的FlashMap)