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

IT技术 javascript angularjs post header cors
2021-01-22 19:51:45

我正在尝试使用 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

所以我用谷歌搜索,我能找到的唯一一个类似的问题是提供了一半的答案,然后作为离题关闭。我应该添加/删除哪些标题?

6个回答

我有同样的问题。在 jQuery 文档中,我发现:

对于跨域请求,将内容类型设置为application/x-www-form-urlencodedmultipart/form-data、 或以外的任何内容text/plain将触发浏览器向服务器发送预检选项请求。

因此,尽管服务器允许跨源请求但不允许Access-Control-Allow-Headers,但它会抛出错误。默认情况下,angular 内容类型是application/json,它正在尝试发送 OPTION 请求。尝试覆盖 angular 默认标头或Access-Control-Allow-Headers在服务器端允许这是一个角度示例:

$http.post(url, data, {
    headers : {
        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
    }
});
这应该是一个可以接受的答案,比另一个提供更多信息!
2021-03-14 19:51:45
or allow Access-Control-Allow-Headers in server end 如何?
2021-03-20 19:51:45
我想要 multipart/form-data 因为我想上传一些东西
2021-03-24 19:51:45
终于,经过两天的研究。我没有话要感谢你!
2021-03-27 19:51:45
@omar 这取决于您使用的服务器平台。如果java有其他答案的例子如果php然后有一个函数名header来设置响应的标题
2021-04-06 19:51:45

服务器(即POST请求被发送到)需要包括Access-Control-Allow-Headers报头(等)在它的响应将它们放入客户的请求中无效。

这是因为由服务器指定它接受跨域请求(并允许Content-Type请求标头等)——客户端无法自行决定给定的服务器应该允许 CORS。

@Mayuresh yourKey 是什么?Content-Type?
2021-03-12 19:51:45
如何在后端设置标题?
2021-03-21 19:51:45
@ user3194367:取决于您的后端。
2021-03-26 19:51:45
response.addHeader("Access-Control-Allow-Headers", "yourKey");
2021-04-04 19:51:45
我想我得和我的服务员谈谈。
2021-04-07 19:51:45

如果这对任何人有帮助,(即使这有点糟糕,因为我们只能出于开发目的才允许这样做)这是一个 Java 解决方案,因为我遇到了同样的问题。[编辑] 不要使用通配符 * 因为它是一个糟糕的解决方案,localhost如果您确实需要在本地运行某些东西,请使用它

public class SimpleCORSFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "my-authorized-proxy-or-domain");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    chain.doFilter(req, res);
}

public void init(FilterConfig filterConfig) {}

public void destroy() {}

}
正如 Access-Control-Request-Headers 的多个答案所证明的那样,由于环境不同,显然存在差异。对我有用的是访问请求对象并转储标头的值,但特别是“Access-Control-Request-Headers”的标头值。然后,将其复制/粘贴到您的 response.setHeader("Access-Control-Allow-Headers", "{paste here}"); 我也在使用 Java,但我需要额外的值,而在这个答案中提到的一些我不需要。
2021-03-11 19:51:45
这是一年前帮助人们并分享线索的部分(并且如上所述,很差)的解决方案。我不明白反对投票的意义,但这是你的自由。这个想法是在服务器端允许头,所以当一个 OPTION 请求被发布时,客户端/浏览器知道哪些头是允许的。我承认有些混乱,从那时起我的 CORS 过滤器发生了很大变化。作为一种更好的做法,Access-Control-Allow-Origin 永远不应该是 *; 在我的实现中,它是由一个属性设置的。
2021-03-15 19:51:45
已编辑解决方案以包含最佳实践
2021-04-02 19:51:45

服务器(POST 请求发送到的)需要在其响应中包含Content-Type标头。

这是要包含的典型标头列表,包括一个自定义的“X_ACCESS_TOKEN”标头:

"X-ACCESS_TOKEN", "Access-Control-Allow-Origin", "Authorization", "Origin", "x-requested-with", "Content-Type", "Content-Range", "Content-Disposition", "Content-Description"

这就是您的 http 服务器人员需要为您发送请求的 Web 服务器配置的内容。

您可能还想请您的服务器人员公开“Content-Length”标头。

他会将此视为跨域资源共享 (CORS) 请求,并且应该了解进行这些服务器配置的含义。

详情请见:

您可以使用以下方法在 PHP 中激活正确的标头:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, X-Requested-With");
@DanielZA 虽然我理解你所说的“其他答案深入技术方面”的意思,因为你只是想让你的代码运行,所以是为了深入研究事物的技术方面,因为你应该知道为什么事情不仅有效如何制作然后工作。在评论解决方案时不要鼓励这种行为......
2021-03-16 19:51:45
你是一个摇滚明星,其余的答案深入技术方面。您通过指定也应该允许的方法来解决我的问题!
2021-03-18 19:51:45
请描述您的答案与其他答案有何不同。仅仅发布一些代码并不是很有帮助。
2021-04-02 19:51:45