2012-09-27 77 views
3

我使用Spring MVC 3,我有以下控制器隱藏@ModelAttribute變量出現在URL中? Spring MVC的

@RequestMapping(value="FileUploadForm",method=RequestMethod.GET) 
public String showForm(ModelMap model){ 
    UploadForm form = new UploadForm(); 
    model.addAttribute("FORM", form); 
    return "FileUploadForm"; 
} 

@RequestMapping(value="FileUploadForm",method=RequestMethod.POST) 
public ModelAndView processForm(@ModelAttribute(value="FORM") UploadForm form,BindingResult result){ 
    if(!result.hasErrors()){ 
     FileOutputStream outputStream = null; 
     String filePath = System.getProperty("java.io.tmpdir") + "/" + form.getFile().getOriginalFilename(); 
     try { 
      outputStream = new FileOutputStream(new File(filePath)); 
      outputStream.write(form.getFile().getFileItem().get()); 
      outputStream.close(); 
      System.out.println(form.getName()); 


      return new ModelAndView(new RedirectView("success?Filepath="+filePath, true, true, false)); 
     } catch (Exception e) { 
      System.out.println("Error while saving file"); 
      return new ModelAndView("FileUploadForm"); 
     } 

    }else{ 
     return new ModelAndView("FileUploadForm"); 
    } 

} 

該控制器獲取的文件路徑和使用做了爆炸

@RequestMapping(value="success") 
public String blasta(@ModelAttribute("Filepath") String filepath, Model model){ 
    Blast sb = new Blast("somepath"); 
    String[] blastIt = sb.blast("somepath", filepath); 
    String newLine = System.getProperty("line.separator"); 
    ArrayList<Object> result = new ArrayList<>(); 

    for (int i = 5; i < blastIt.length; i++) { 
     if(blastIt[i].startsWith("Lambda")){ 
      break; 
     } else { 
      seila.add(blastIt[i]); 
      System.out.println(blastIt[i]); 
     } 
     model.addAttribute("RESULT", result); 

    }  
    File f1 = new File(filepath); 
    f1.delete(); 
    return "success"; 

} 

一切工作正常,但我仍然得到url中的文件路徑。

http://localhost:8081/Ambase/success?Filepath=filePath 

而且我想這樣,如果有可能

http://localhost:8081/Ambase/success 
+0

你爲什麼要標註使用'@ModelAttribute( 「文件路徑」)'文件路徑?你是否應該使用@PathVarible(「Filepath」)來獲取POST/GET參數? – gigadot

+0

此外,使用POST請求重定向視圖是不可能的,因此無法隱藏查詢路徑。重定向在客戶端完成,而不是在服務器上完成。 – gigadot

+0

嗯,我刪除了POST請求,但另一個我沒有得到,我使用modelattribute傳遞文件創建到另一個控制器的路徑,所以我可以使用文件 –

回答

0

爲了避免這個問題,你應該使用RedirectAttributes。它會將filePath的值添加到重定向視圖params中,並且您可以在控制器blasta中獲得該值。

要達到此目的,您需要在控制器功能processForm中添加一個參數。在所有參數結尾添加RedirectAttributes attributes,然後在RedirectView語句上方添加以下行。

attributes.addFlashAttribute("Filepath",filePath); 

然後你就可以得到在ModelMap這個屬性裏面blasta控制器功能。

希望這可以幫助你。乾杯。

2

嘗試添加該代碼的servlet-config.xml中

<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" /> 
+0

在Spring 4.x.x中,它是'ignore-default-model-on-redirect =「true」' – Andremoniy