Spring MVC上传文件 - HTTP状态405 - 请求方法' POST'不支持

时间:2014-07-26 09:52:28

标签: java spring-mvc file-upload

我试图通过JSP和控制器上传文件,但我总是得到

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

输入状态报告

消息请求方法' POST'不支持

description请求的资源不允许使用指定的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 - 请求方法&#39; POST&#39;不支持

你能帮我一个人吗? :(


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

@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/

我在所有人中使用相同的&#34;动作风格&#34;它的工作原理。当我按下按钮时,以这种形式。它以正确的方式重定向我。我试图改变我的行动

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

4 个答案:

答案 0 :(得分:12)

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

我解决了这个问题,我添加了?$ {_ csrf.parameterName} = $ {_ csrf.token} 来结束表单操作

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

现在有效!

答案 1 :(得分:0)

@RequestMapping的值是“/admin/product.file.add”,表单的动作是action =“product.file.add”。我认为应该是action =“/ admin / product.file.add”

或者您可以尝试使用<form method="POST" enctype="multipart/form-data" action="/product.file.add">

答案 2 :(得分:0)

我有同样的问题,我的解决方案也不同。在我的情况下,我使用基于注释的配置我使用@Controller注释我的类,但我从未告诉配置类扫描控制器所在的包,并且执行此操作的方法是使用

@ComponentScan(basePackages = "com.controllers.location.package") 

答案 3 :(得分:0)

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