我們都知道,重定向時(shí)一般都是不傳數(shù)據(jù)的疹瘦,如果一定要傳數(shù)據(jù)崩哩,只能在URL中拼接字符串來傳遞,但是通過拼接字符串有缺點(diǎn)拱礁,比如長度問題琢锋,安全問題
那有沒有什么方法能做到隱藏傳送呢?
答案就是SpringMVC中的FlashMap呢灶!
在SpringMVC中吴超,每次請求都會(huì)走到DispatcherServlet的service方法中(因?yàn)橹貙懥薍ttpServlet的service方法)
當(dāng)進(jìn)入service方法后,有趣的事情來了:
Spring會(huì)先判斷目前這個(gè)請求request中的FlashMap會(huì)不會(huì)等于null
// 每次處理請求時(shí)鸯乃,都會(huì)先判斷一下FlashMap中是否有數(shù)據(jù)
// 如果有就先設(shè)置到 inputFlashMap里面鲸阻,也就是保存上次轉(zhuǎn)發(fā)過來的屬性
// 再設(shè)置到Model里面
FlashMap inputFlashMap = this.flashMapManager.retrieveAndUpdate(request, response);
if (inputFlashMap != null) {
request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
}
如果不為空跋涣,就代表前一次請求(一般是重定向)中有設(shè)置參數(shù),就把這些參數(shù)存進(jìn)現(xiàn)在的FlashMap中
request.setAttribute(INPUT_FLASH_MAP_ATTRIBUTE, Collections.unmodifiableMap(inputFlashMap));
這樣的話請求中就帶有上一個(gè)重定向傳過來的參數(shù)了D胥病陈辱!
SpringMVC中使用redirect傳遞參數(shù)的三種方法:
public String test(RedirectAttributes attr){
//第一種,使用RequestContextHolder獲得FlashMap
// ((FlashMap)((ServletRequestAttributes)(RequestContextHolder.getRequestAttributes())
// .getAttribute(DispatcherServlet.OUTPUT_FLASH_MAP_ATTRIBUTE)
// emm..第一種忘了怎么寫了
// 第二種
attr.addFlashAttribute("userName", "SouthLight-Lin");
// 第三種细诸,直接拼接在URL中沛贪,不會(huì)被隱藏
attr.addAttribute("local", "zh-cn");
return null;
}