一丶? 為什么要重定向枣宫?
Spring MVC中做form表單功能提交時(shí)友酱,防止用戶客戶端后退或者刷新時(shí)重復(fù)提交問題评甜,需要在服務(wù)端進(jìn)行重定向跳轉(zhuǎn),其中redirect是直接跳轉(zhuǎn)到其他頁面存炮。
二丶? redirect重定向流程
客戶發(fā)送一個(gè)請求到服務(wù)器撼玄,服務(wù)器匹配servlet夺姑,這都和請求轉(zhuǎn)發(fā)一樣,servlet處理完之后調(diào)用了sendRedirect()這個(gè)方法掌猛,這個(gè)方法是response的方法盏浙,所以,當(dāng)這個(gè)servlet處理完之后荔茬,看到response.senRedirect()方法废膘,立即向客戶端返回這個(gè)響應(yīng),響應(yīng)行告訴客戶端你必須要再發(fā)送一個(gè)請求慕蔚,去訪問test.jsp丐黄,緊接著客戶端受到這個(gè)請求后,立刻發(fā)出一個(gè)新的請求孔飒,去請求test.jsp,這里兩個(gè)請求互不干擾灌闺,相互獨(dú)立,在前面request里面setAttribute()的任何東西坏瞄,在后面的request里面都獲得不了桂对。可見惦积,在sendRedirect()里面是兩個(gè)請求接校,兩個(gè)響應(yīng)。
三丶? 三種重定向的方式
1. response.sendRedirect重定向跳轉(zhuǎn)
@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET })?
public ModelAndView testredirect(HttpServletResponse response){?
? ? response.sendRedirect("/index");
? ? return null;
}
不帶參數(shù)
@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET })?
public? String testredirect(HttpServletResponse response){?
? ? return "redirect:/index";?
}
帶參數(shù)
@RequestMapping("/testredirect")
public String testredirect(Model model, RedirectAttributes attr) {
attr.addAttribute("test", "51gjie");//跳轉(zhuǎn)地址帶上test參數(shù)
? ? ? ? attr.addFlashAttribute("u2", "51gjie");//跳轉(zhuǎn)地址不帶上u2參數(shù)
return "redirect:/user/users";
}
使用RedirectAttributes的addAttribute方法傳遞參數(shù)會(huì)跟隨在URL后面狮崩,如上代碼即為http:/index.action?test=51gjie
使用addFlashAttribute不會(huì)跟隨在URL后面,會(huì)把該參數(shù)值暫時(shí)保存于session鹿寻,待重定向url獲取該參數(shù)后從session中移除睦柴,這里的redirect必須是方法映射路徑,jsp無效毡熏。你會(huì)發(fā)現(xiàn)redirect后的jsp頁面中b只會(huì)出現(xiàn)一次坦敌,刷新后b再也不會(huì)出現(xiàn)了,這驗(yàn)證了上面說的痢法,b被訪問后就會(huì)從session中移除狱窘。對(duì)于重復(fù)提交可以使用此來完成.
spring mvc設(shè)置下RequestMappingHandlerAdapter 的ignoreDefaultModelOnRedirect=true,這樣可以提高效率,避免不必要的檢索财搁。
不帶參數(shù)
@RequestMapping(value="/restredirect",method = { RequestMethod.POST, RequestMethod.GET })?
public? ModelAndView restredirect(String userName){?
? ? ModelAndView? model = new ModelAndView("redirect:/main/index");? ?
? ? return model;?
}
帶參數(shù)
@RequestMapping(value="/toredirect",method = { RequestMethod.POST, RequestMethod.GET })?
public? ModelAndView toredirect(String userName){?
? ? ModelAndView? model = new ModelAndView("/main/index");?
? ? model.addObject("userName", userName);? //把userName參數(shù)帶入到controller的RedirectAttributes
? ? return model;?
}
總結(jié)
1, redirect重定向可以跳轉(zhuǎn)到任意服務(wù)器蘸炸,可以用在系統(tǒng)間的跳轉(zhuǎn)。
2, Spring MVC中redirect重定向尖奔,參數(shù)傳遞可以直接拼接url也可以使用RedirectAttributes來處理搭儒,由于是不同的請求穷当,重定向傳遞的參數(shù)會(huì)在地址欄顯示,所以傳遞時(shí)要對(duì)中文編碼進(jìn)行處理淹禾。