例子1. 假設你去辦理護照
java
重定向: 你先去了A局, A局的人說: "這個事情不歸咱們管的,你去B局吧", 而後你就從A局退了出來, 去了B局web
轉發: 你先去了A局, A局看了之後知道這個事情其實應該由B局來管的, 可是沒有把你退回來,而是讓你坐一下子,本身到後面辦公室聯繫了B局的人,讓他們辦好以後給送了回來spring
總結:瀏覽器
請求轉發是服務器的行爲,重定向是客戶端的行爲服務器
請求轉發的流程是:客戶端瀏覽器發送請求->web服務器接受->調用內部的方法容器內部完成請求處理和轉發動做->session
將目標資源發送給客戶mvc
在客戶瀏覽器路徑下顯示的是第一次訪問的路徑,也就是說客戶端感受不到服務器端作了轉發,轉發行爲是瀏覽器只作了一次訪問的app
重定向的流程是:客戶端瀏覽器發送請求->web服務器接受後發送302狀態碼響應->客戶端發現是302響應,則自動發送一個新的請求->服務器根據此請求尋找資源發送給客戶jsp
在客戶端瀏覽器路徑欄顯示的是其重定向的路徑,客戶能夠觀察地址的變化,重定向的行爲是瀏覽器作了至少兩次訪問ui
在重定向的過程當中,傳輸的信息會被丟失
(1)返回ModelAndView
@RequestMapping(value="/forward",method=RequestMethod.GET) public ModelAndView testForward(ModelAndView model,@RequestParam(value="id",defaultValue="1",required=false)Long id){ User u = getBaseService().get(User.class, id); model.addObject("user", u); model.setViewName("forward:index.jsp"); return model; }
(2) 返回字符串
@RequestMapping(value="/forward",method=RequestMethod.GET) public String testForward(){ return "forward:/index.action"; }
@RequestMapping(value="/redirect",method=RequestMethod.GET) public String testRedirect(RedirectAttributes attr){ attr.addAttribute("a", "a"); attr.addFlashAttribute("b", "b"); return "redirect:/index.action"; }
這裏須要說明一下:
1.使用RedirectAttribute的addAttribute方法傳遞參數會跟隨URL後面,如上面即爲http://index.action?a=a
2.使用addFlashAttribute不會跟在URL後面,會把該參數值暫時保存在session中,待重定向url獲取該參數後從session中移除
@RequestMapping(value="/redirect",method=RequestMethod.GET) public String testRedirect(){ return "redirect:/index.action"; }