【问题标题】:Response for preflight has invalid HTTP status code 400预检响应具有无效的 HTTP 状态代码 400
【发布时间】:2016-01-18 19:23:17
【问题描述】:

我正在尝试使用 AJAX 进行 REST 调用 (POST)。这是我的 AJAX 代码

<script>
var settings = {
"async": true,
"crossDomain": true,
"dataType": "json",
"url": "http://localhost:port/service/myservice",
"method": "POST",
"data": '{jsondata}',
"headers": {
      "accept": "application/json",
      "Authorization": "authValue"
  }
}

$.ajax(settings)

.done(function (response) {
  console.log(response);
});
</script>

最初我收到此错误:XMLHttpRequest 无法加载http://localhost:port/service/myservice。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'null' 不允许访问。响应的 HTTP 状态代码为 400。

为了解决这个问题,我在 dropwizard 应用程序中添加了以下代码

Dynamic filter = env.servlets().addFilter("CORS", CrossOriginFilter.class);

filter.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,PUT,POST,DELETE,OPTIONS");
filter.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
    filter.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, "*");
filter.setInitParameter("allowedHeaders", "Content-Type,Authorization,X-Requested-With,Content-Length,Accept,Origin");
filter.setInitParameter("allowCredentials", "true");

filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");

添加后,我的初始异常消失了,但出现以下异常:XMLHttpRequest 无法加载http://localhost:port/service/myservice。预检响应包含无效的 HTTP 状态代码 400

这个问题与 CORS 有关吗?我在这里做错了什么?

更新

在进行更多调试后,我发现了这种行为。发送没有授权标头的请求时,我收到 415 (Unsupported Media Type) 错误。

我认为我的 AJAX 代码有问题,有人可以帮我找出问题吗?谢谢。

【问题讨论】:

    标签: javascript java ajax cors dropwizard


    【解决方案1】:

    如果您需要在 AJAX 调用中传递 JSON 数据,则需要将 content-type 指定为 json/application,以便服务器知道您正在尝试发送 JSON 数据。但这将改变呼叫的默认内容类型,并且呼叫将有资格进行飞行前检查,这需要适当的启用 CORS 的客户端和服务器请求。

    为了更方便的用例,传递数据时不要使用 JSON.stringify(),只需创建一个 {key:value, key:value, ...} 格式的简单字符串,并将字符串作为数据传递。 Ajax 调用默认序列化数据并执行正确的操作,并且调用保持为对服务器的单个 POST 调用,而预飞行模式是两次调用。

    【讨论】:

      【解决方案2】:

      您可以尝试here 在此线程中作为完整答案提及。

      $.ajax({
              type:"POST",
              beforeSend: function (request)
              {
                  request.setRequestHeader("Authority", authValue);
              },
              url: "http://localhost:port/service/myservice",
              data: "json=" + escape(JSON.stringify(createRequestObject)),
              processData: false,
              success: function(msg) {
                  $("#results").append("The result =" + StringifyPretty(msg));
              }
      });
      

      【讨论】:

        【解决方案3】:

        尝试将以下内容添加到您的设置中?

        xhrFields: { withCredentials: true }
        

        【讨论】:

          猜你喜欢
          • 2017-05-10
          • 2016-05-19
          • 2017-08-24
          • 2018-09-06
          • 2018-09-13
          • 1970-01-01
          • 2016-12-17
          • 2018-04-19
          • 1970-01-01
          相关资源
          最近更新 更多