java - spring mvc 的 Curl POST 请求给出 405 方法 'POST' 不支持

标签 java spring-mvc curl restful-url tomcat8

我有一个 SPRING 4 应用程序。它使用 Spring Security Ldap 身份验证进行身份验证。一切正常,但是当我尝试执行 POST 请求时,它失败并给出警告:org.springframework.web.servlet.PageNotFound - 不支持请求方法“POST”。

我正在尝试在脚本中使用curl 命令执行发布请求,该命令会触发 Controller 的POST 方法并上传文件。

spring-security.xml

 <?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:security="http://www.springframework.org/schema/security"
    xsi:schemaLocation="http://www.springframework.org/schema/security
      http://www.springframework.org/schema/security/spring-security.xsd
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd">


    <security:http auto-config="true" use-expressions="true">
      <security:intercept-url pattern="/login" access="permitAll()" />




      <security:intercept-url pattern="/info"  access="permitAll()" method="GET" />
      <security:intercept-url pattern="/bookings" access="isAuthenticated()" method="POST"/>

      <security:intercept-url pattern="/chartdata"    access="isAuthenticated()" method="GET" />
      <security:intercept-url pattern="/uploadData/*" access="isAuthenticated()" method="POST"/> <!-- Change2 -->
  <security:intercept-url pattern="/**"     access="isAuthenticated()" />

      <security:form-login login-page="/login"
        login-processing-url="/performLogin"
        authentication-failure-url="/login?error=true" />
      <access-denied-handler error-page="/login" />
    </security:http>


    <security:authentication-manager alias="authenticationManager">
        <security:ldap-authentication-provider  user-dn-pattern="uid={0}, ou=People,o=XXX" />
    </security:authentication-manager>

    <ldap-server url="ldap://ldap.xxx.com/dc=xxx,dc=com" port="389" />
</beans:beans>

Controller .java

@RequestMapping(value = "/uploadData/{type}****?${_csrf.parameterName}=${_csrf.token}****", headers = {"Accept=*/*","enctype=multipart/form-data"}, method = {RequestMethod.POST, RequestMethod.GET }, consumes="*/*")
public String uploadData_type( //
        @PathVariable("type") final String type, //
        @RequestParam("theDate") final String theDate, //        
        @RequestParam("data") final MultipartFile theFile //
        ) {
    String status_message = null;
    Tracking.message("Importing '%s' file: '%s'", type, theFile.getOriginalFilename());
     ..........
}

类型,一旦脚本执行curl 调用,日期和数据就会从脚本传递。

脚本代码:

#!/bin/bash

SILENT=--silent

THIS_SCRIPT=${0##*/}

FILETYPE=$1
theFile=$2
theFileName=${theFile##*/}
theDate=${theFileName##*.}

URL="http://localhost:8080/gds-report/uploadData/$FILETYPE"

msg=$(curl $SILENT -X POST  -F "data=@$theFile" -F "theDate=$theDate" -F "filename=$theFileName"  -H "Content-Type: multipart/form-data"  "$URL")
echo -n $THIS_SCRIPT: 
if [ -z "$msg" ] ; then
   echo "Results - no message received"
   exit 1
else
   echo "Results: $msg"
fi

我尝试了在 stackoverflow 上找到的 2 个解决方案: 1)编辑并尝试在请求中传递 csrf 参数或更改禁用 csrf 的方法类型。但是,不幸的是,它总是给我一个 405 错误。 2)将此bean 添加到我的app-servlet.xml 文件中,以允许上传大尺寸文件。

<beans:bean id="multipartResover"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <beans:property name="maxUploadSize" value="2000000">
        </beans:property>
    </beans:bean>

我尝试使用Windows 的curl 进行调试,并且POSTMAN 都给出了相同的错误。我在任何文档中都找不到更多有关此内容的信息。有人可以帮忙吗,我认为这是我所缺少的一些很小的事情。

下面的 POSTMAN ERROR OUTPUT 显示了一个 Allow: GET header ,即使我使用 POST 方法请求并且响应 header 仅包含Allow:GET,我也不明白为什么会出现它。

Allow → GET
Cache-Control → no-cache, no-store, max-age=0, must-revalidate
Content-Language → en
Content-Length → 1090
Content-Type → text/html;charset=ISO-8859-1
Date → Thu, 25 Feb 2016 08:54:26 GMT
Expires → 0
Pragma → no-cache
Server → Apache-Coyote/1.1
X-Content-Type-Options → nosniff
X-Frame-Options → DENY
X-XSS-Protection → 1; mode=block

注意: Controller 中的 GET 请求已成功完成。只是帖子根本不起作用。请给我建议。 Spring 4。Java 8 Tomcat 8。

最佳答案

这里可能有两件事:您的防火墙规则可能会阻止后操作本身,在这种情况下您可以编写一个新的异常(exception)(或尝试在不打开防火墙的情况下进行检查)。另一种可能性是路由器本身可能会阻止请求,就好像流量被视为“类似服务器的行为”,这可能需要将端口转发异常写入路由器。

关于java - spring mvc 的 Curl POST 请求给出 405 方法 'POST' 不支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35623317/

相关文章:

java - 使用 JGit 推送更改的文件时遇到 TransportException "Nothing to push"

java - 如何在 RESTful Web 服务中为 "action oriented"方法创建路径?

linux - 通过 cURL 发送密码安全吗?

java - 使用前后空格从短语中提取单词?

java - CollectionUtils.retainAll 方法不起作用(Java)

java - 使用多个参数的 Spring Security 登录

php - cURL 使用字符串发布多个值

javascript - Axios 后调用无法按预期工作

java - 在 Thymeleaf 中使用 instanceof

java - Spring:如何获得 "ACTUAL"/"CURRENT"区域设置,就像它适用于消息一样?