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

10

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

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。

@RequestMapping 中的点具有特殊含义,如果您不需要它们,请尝试在没有点的情况下执行操作,例如 @RequestMapping(value = "/admin/productfileadd", method = RequestMethod.POST)<form method="POST" enctype="multipart/form-data" action="productfileadd"> - Andreas
我尝试了一下没有使用点号,但是还是得到了相同的错误 :( - user1604064
你能否查看你正在发布到哪里,例如使用 Fiddler,也许你没有调用正确的操作,应该是 action="/admin/productfileadd" - Andreas
顺便说一下,这与您的文件上传代码无关。在您配置Spring MVC的方式中存在某些固有问题 - 不是特定于上传功能。 - Pat
我添加了以下我的控制器,只清除与此问题相关的控制器,而不是所有方法。 - user1604064
显示剩余3条评论
4个回答

14
主要问题出在Spring安全性上。我已经解决了这个问题。Spring安全性阻拦了我的URL,但我不知道为什么。
我已解决这个问题,我在我的表单操作的末尾添加了?${_csrf.parameterName}=${_csrf.token}
<form method="POST" action="uploadOneFile**?${_csrf.parameterName}=${_csrf.token}**" enctype="multipart/form-data">

现在它正常工作了!


你的解决方案适用于我的一个项目,但对于另一个项目却不起作用。 - prem30488
我刚刚犯了一个错误。是的,这个解决方案有效。谢谢。 - prem30488
1
关于为什么需要 enctype="multipart/form-data" 以及解决此问题的两种可接受方式,以下是更多背景信息:https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html - Michael

0
我曾经遇到过同样的问题,但我的解决方案不同。在我的情况下,我使用基于注释的配置,我用@Controller注释了我的类,但我从未告诉配置类扫描我的控制器所在的包,解决方法是用注释标注你的配置类。
@ComponentScan(basePackages = "com.controllers.location.package") 

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">


我认为问题不在操作上,请看下面,当我操作错误时,会得到404而不是405。 - user1604064

0

Spring MVC默认配置为通过要求在POST请求中返回由服务器生成的CSRF令牌来防止跨站点请求伪造(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关于CSRF的文档

在决定禁用CSRF请求验证之前,应该权衡其带来的危险性 - 在某些情况下,它会使您的用户容易受到操作劫持的攻击。

以下是关于此主题的另外两篇有用的文章: https://www.baeldung.com/spring-security-csrf https://www.baeldung.com/csrf-thymeleaf-with-spring-security


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接