我试图用post请求发送文件到我的服务器,但当它发送时,它会导致错误:

Access-Control-Allow-Headers不允许请求报头字段Content-Type。

所以我谷歌了这个错误,并添加了标题:

$http.post($rootScope.URL, {params: arguments}, {headers: {
    "Access-Control-Allow-Origin" : "*",
    "Access-Control-Allow-Methods" : "GET,POST,PUT,DELETE,OPTIONS",
    "Access-Control-Allow-Headers": "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
}

然后我得到错误:

Access-Control-Allow-Headers不允许请求报头字段Access-Control-Allow-Origin

所以我谷歌了一下,我能找到的唯一类似的问题是提供了一半的答案,然后关闭为跑题。我应该添加/删除什么头?


当前回答

您试图设置的头是响应头。它们必须在响应中由您发出请求的服务器提供。

在客户端上没有设置它们的位置。如果可以由需要权限的站点而不是拥有数据的站点授予权限,那么使用一种授予权限的方法就毫无意义了。

其他回答

在Asp Net Core中,快速让它工作;在Startup.cs中,配置add方法

app.UseCors(options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());

您试图设置的头是响应头。它们必须在响应中由您发出请求的服务器提供。

在客户端上没有设置它们的位置。如果可以由需要权限的站点而不是拥有数据的站点授予权限,那么使用一种授予权限的方法就毫无意义了。

在我的例子中,我将几个参数作为@HeaderParam接收到一个web服务方法中。

这些参数必须在你的CORS过滤器中声明:

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        ...
        headers.add("Access-Control-Allow-Headers", 
        /*
         * name of the @HeaderParam("name") must be declared here (raw String):
         */
        "name", ...);
        headers.add("Access-Control-Allow-Credentials", "true");
        headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");   
    }
}

服务器(POST请求被发送到的服务器)需要在其响应中包含Access-Control-Allow-Headers头(等等)。将它们放在客户端的请求中是没有效果的。您应该删除“Access-Control-Allow-…”从你的POST请求。

这是因为由服务器来指定它是否接受跨源请求(以及它是否允许Content-Type请求头等等)——客户机不能自己决定给定的服务器是否应该允许CORS。

请求者(web浏览器)可以通过发送一个“OPTIONS”请求(即不是你想要的“POST”或“GET”请求)来“preflight”测试服务器的同源策略。如果对'OPTIONS'请求的响应包含'Access-Control-Allow-…'头,允许你的请求使用的头,来源或方法,然后请求者/浏览器将发送你的'POST'或'GET'请求。

(模糊的注释:)Access-Control-Allow-…使用值”,而不是列出特定的来源、头文件或允许的方法。然而,我使用的旧Android WebView客户端不尊重“通配符,需要在OPTIONS请求的响应中Access-Control-Allow-Headers头中列出的特定头。

请求报头字段Access-Control-Allow-Origin被Access-Control-Allow-Headers错误不允许 表示HTTP报头的Access-Control-Allow-Origin字段不被响应处理或允许。从请求头中删除Access-Control-Allow-Origin字段。