关于javascript:预检的响应包含无效的HTTP状态代码400

Response for preflight has invalid HTTP status code 400

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
});

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

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

1
2
3
4
5
6
7
8
9
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有关吗?我在这做错了什么?

UPDATE

在做了更多调试后,我发现了这种行为。发送没有Authorization标头的请求时,我收到415(不支持的媒体类型)错误。

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


你可以在这里尝试提到完整的答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
$.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));
        }
});

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

为了更简单的用例,在传递数据时不要使用JSON.stringify(),只需使用{key:value,key:value,...}格式创建一个简单的字符串,并将字符串作为数据传递。 Ajax调用默认情况下序列化数据并做正确的事情,并且调用保持为对服务器的单个POST调用,其中前置模式是两个调用。


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

1
xhrFields: { withCredentials: true }