【问题标题】:Spring MVC upload file - HTTP Status 405 - Request method 'POST' not supportedSpring MVC 上传文件-HTTP 状态 405-不支持请求方法“POST”
【发布时间】:2014-09-18 03:16:19
【问题描述】:

我正在尝试通过 JSP 和控制器上传文件,但我总是得到 ​​p>

HTTP 状态 405 - 不支持请求方法“POST”

输入状态报告

不支持消息请求方法“POST”

说明 请求的资源不允许使用指定的 HTTP 方法。

这是我的表单(只是所有 JSP 页面的一部分):

<form method="POST" enctype="multipart/form-data" action="product.file.add">
    <input name="productId" type="hidden" />
    <tr>
        <th>Foto: </th>
        <td><input type="file" name="file" /></td>
    </tr>
    <tr>
        <td class="bt" ><input type="submit" value="Add image" /></td>
        <td class="bt" ><input type="submit" value="Continue without image" /></td>
    </tr>
</form>

我的控制器部分(现在只显示文件名):

@RequestMapping(value = "/admin/product.file.add", method = RequestMethod.POST)
    public String productFileUpload(@RequestParam("file") MultipartFile file,
            @RequestParam("productId") int productId) {
        logger.info(file.getName());
        return "redirect:/admin/product";
}

以及 servlet-context.xml 的一部分

<beans:bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

但我总是得到:

HTTP 状态 405 - 不支持请求方法“POST”

你能帮帮我吗? :(


我的控制器没有所有方法:

@Controller
public class ProductController {

    @Autowired
    private ProductDao productDao;

    @Autowired
    private ProducerDao producerDao;

    @Autowired
    private SectionDao sectionDao;

    @Autowired
    private TasteDao tasteDao;

    @Autowired
    private CategoryDao categoryDao;

    private static final Logger logger = LoggerFactory
            .getLogger(ProductController.class);


    @RequestMapping(value = "/admin/productfileadd", method = RequestMethod.POST)
    public String productFileUpload(@RequestParam("file") MultipartFile file,
            @RequestParam("productId") int productId) {
        logger.info(file.getName());
        return "redirect:/admin/product";
    }       


}

我的应用程序运行在:

http://localhost:8080/prosvaly/

我全部使用相同的“动作风格”并且它有效。当我单击按钮时,以这种形式。它以正确的方式重定向我。我试图改变我对

的操作
action="/prosvaly/admin/productfileadd

但还是同样的错误。当我将方法类型从 POST 更改为 GET 时,我收到另一个错误:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: The current request is not a multipart request

所以我认为问题不存在,因为 GET 方法可以找到相同的 URL

【问题讨论】:

  • @RequestMappings 中的点有特殊含义,如果您真的不需要它们,请尝试在没有它们的情况下执行操作,例如@RequestMapping(value = "/admin/productfileadd", method = RequestMethod.POST)&lt;form method="POST" enctype="multipart/form-data" action="productfileadd"&gt;
  • 我试过没有点,我得到了同样的错误:(
  • 你能查一下你发帖的地方吗?对于 Fiddler,也许您没有调用正确的操作,它应该是 action="/admin/productfileadd"
  • 该错误意味着 Spring MVC 无法为 POST 请求找到合适的控制器。发布您的完整控制器代码以及 URL 映射配置。
  • 顺便说一句,只是为了澄清这与您的文件上传代码无关。您配置 Spring MVC 的方式本质上是错误的 - 不是特定于上传功能。

标签: java spring-mvc file-upload


【解决方案1】:

Spring MVC 默认配置为通过要求将服务器生成的 CSRF 令牌作为 POST 请求的一部分返回来防止 Cross-Site Request Forgery (CSRF) 攻击。

将 CSRF 令牌作为表单模板的一部分作为输入很简单:

<input type="hidden"
  th:name="${_csrf.parameterName}"
  th:value="${_csrf.token}">

您可以按路由禁用 CSRF 保护,例如:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http.csrf().disable();
}

这两个例子都来自Spring documentation about CSRF

在决定禁用 CSRF 请求验证之前,应权衡其危险 - 在某些情况下,它会使您的用户面临操作劫持。

这里有几篇关于该主题的更有用的文章: https://www.baeldung.com/spring-security-csrf https://www.baeldung.com/csrf-thymeleaf-with-spring-security

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,但我的解决方案有所不同。在我的情况下,我使用基于注释的配置,我用@Controller 注释了我的类,但我从未告诉配置类扫描我的包控制器所在的位置,这样做的方法是用

    注释你的配置类
    @ComponentScan(basePackages = "com.controllers.location.package") 
    

    【讨论】:

      【解决方案3】:

      主要问题在于春季安全性。我解决了这个问题。 Sprintf 安全阻止了我的 URL,但我不知道为什么。

      我解决了这个问题,我将 ?${_csrf.parameterName}=${_csrf.token} 添加到表单操作的末尾

      <form method="POST" action="uploadOneFile**?${_csrf.parameterName}=${_csrf.token}**" enctype="multipart/form-data">
      

      现在可以了!

      【讨论】:

      • 您的解决方案在我的一个项目中有效,但在另一个项目中无效。
      • 我只是搞错了。是的,这个解决方案有效。谢谢
      • 关于为什么需要 enctype="multipart/form-data" 的更多背景信息,以及解决此问题的两种公认方法:docs.spring.io/spring-security/site/docs/current/reference/html/…
      【解决方案4】:

      @RequestMapping的值为“/admin/product.file.add”,form的action为action="product.file.add"。我认为应该是 action="/admin/product.file.add"

      或者你可以试试&lt;form method="POST" enctype="multipart/form-data" action="/product.file.add"&gt;

      【讨论】:

      • 我认为问题不在行动,请看下面,当我有错误的行动时,我会得到 404 而不是 405
      猜你喜欢
      • 2012-06-24
      • 2015-04-09
      • 2016-03-29
      • 2014-09-24
      • 2013-04-09
      • 2012-04-20
      • 2015-01-13
      • 2013-11-25
      • 2016-05-14
      相关资源
      最近更新 更多