文件上载后防止表单操作更改URL

时间:2015-04-04 21:38:35

标签: java spring

我的Spring MVC项目中有一个处理文件上传的简单表单。

form.jsp

<form method="POST" enctype="multipart/form-data" action="/upload" id="form">
    <input id="file" type="file" name="file"><br />
    <input type="submit" value="Upload">
    <input type="reset" value="Reset">
</form>

由于表单的操作,我被重定向到我localhost:8080/myApp/upload

中指定的localhost:8080/myApp/form而不是@Controller
@RequestMapping(method = RequestMethod.POST, value = "${context}/upload", headers = "content-type=multipart/*")
    public String uploadFile(@RequestParam("file") MultipartFile file, Model model) {
    //do some upload stuff
    model.addAttribute("uploadSuccess", "Upload Successful.");
    return "/form";
}

是否可以仅阻止表单操作的重定向,但仍保留值${context}/upload以便调用我的Controller方法?我需要我的页面返回myApp/form,因为这个特殊的url会调用一个单独的Controller方法来检索一些数据

请注意,我不希望将我的jsp文件重命名为'upload.jsp'而且我不想制作一个AJAX帖子(谢谢IE9)。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

Spring's Docs

17.5.3重定向到视图找到我的确切案例的答案
  

有时需要将HTTP重定向发回给   客户端,在呈现视图之前。这是可取的,例如,   当一个控制器被POST数据和响应调用时   实际上是另一个控制器的委托(例如在   成功提交表格)。在这种情况下,正常的内部前进   意味着另一个控制器也会看到相同的POST数据,   如果它可能会与其他人混淆,这可能会有问题   预期数据。

可以通过以下方式完成:

return "redirect:/form";

redirect的一个好处是它可以防止用户通过执行刷新意外重新POST相同的数据。刷新会强制结果页面GET,而不是重新发送初始POST数据。

更新:

默认redirect:/view会将您的模型属性作为查询参数附加到您的网址。在某些情况下这可能是不合需要的,因为它可能将敏感信息暴露给用户。利用RedirectAttributes addFlashAttribute(String attributeName, Object attributeValue)方法存储Flash属性,用于在从一个URL重定向到另一个URL时存储属性(成功/失败消息等)