AngularJS未检测到访问控制允许原始标头?

AngularJS未检测到访问控制允许原始标头?,angularjs,angularjs-http,Angularjs,Angularjs Http,我正在本地virtualhost()上运行angular应用程序。它正在使用$http.post向另一个本地VirtualHost()发出请求 $http.post('http://bar.app:8000/mobile/reply', reply, {withCredentials: true}); 在Chrome Developer Tools的网络选项卡中,我当然看到了选项请求,响应包括标题: Access-Control-Allow-Origin: http://foo.app:800

我正在本地virtualhost()上运行angular应用程序。它正在使用
$http.post
向另一个本地VirtualHost()发出请求

$http.post('http://bar.app:8000/mobile/reply', reply, {withCredentials: true});
在Chrome Developer Tools的网络选项卡中,我当然看到了选项请求,响应包括标题:

Access-Control-Allow-Origin: http://foo.app:8000
但是,POST请求被取消,出现以下错误:

请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”

有人经历过吗?
Access Control Allow Origin
头非常明确地包含在选项请求的响应中,因此我一辈子都无法弄清楚为什么POST正在执行操作,而头丢失了


Access Control Allow Credentials
也设置为
true

这是chrome for local dev中的一个错误。请尝试其他浏览器。那就行了

我今天遇到了这个问题。事实证明,服务器上的一个bug(null指针异常)导致它无法创建响应,但它仍然生成了200的HTTP状态代码。由于状态代码为200,Chrome希望得到有效的响应。Chrome做的第一件事是查找“Access Control Allow Origin”标题,但没有找到。然后Chrome取消了请求,Angular给了我一个错误。处理POST请求过程中的错误是选项会成功但POST会失败的原因


简而言之,如果您看到此错误,可能是您的服务器根本没有响应POST请求返回任何标题。

我遇到了完全相同的问题。对我来说,选项请求会通过,但是POST请求会说“中止”。这让我相信浏览器根本没有发出POST请求。Chrome说,请求头中显示了类似“注意”的临时头,但没有显示响应头。最后,我转向Firefox上的调试,这让我发现我的服务器响应时出现了错误,并且响应中没有CORS头。Chrome实际上收到了响应,但不允许在网络视图中显示响应。

我使用$http服务从angularjs发送请求,以运行
http://localhost:8090/
我必须申请,否则我会遇到如下请求错误“请求的资源上不存在“Access Control Allow Origin”标头”


对于那些想使用Chrome的人来说,有一个解决办法。允许你从任何来源请求任何带有AJAX的站点,因为它在响应中添加了
'Access-Control-Allow-Origin:*'
标题

或者,您可以将此参数添加到Chrome启动器中:
--禁用web安全性
。请注意,我仅将此参数用于开发目的,而不是用于正常的“web冲浪”。有关参考信息,请参阅


最后,通过安装第一段中提到的扩展,您可以轻松地启用/禁用CORS。

CRO需要从服务器端解决

根据要求创建过滤器以允许访问并在web.xml中添加过滤器

使用spring的示例:

过滤器类别:

@Component
public class SimpleFilter implements Filter {

@Override
public void init(FilterConfig arg0) throws ServletException {}

@Override
public void doFilter(ServletRequest req, ServletResponse resp,
                     FilterChain chain) throws IOException, ServletException {

    HttpServletResponse response=(HttpServletResponse) resp;

    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with");

    chain.doFilter(req, resp);
}

@Override
public void destroy() {}

}
Web.xml:

<filter>
    <filter-name>simpleCORSFilter</filter-name>
    <filter-class>
        com.abc.web.controller.general.SimpleFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>simpleCORSFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

单纯形滤波器
com.abc.web.controller.general.SimpleFilter
单纯形滤波器
/*

当您的参数在请求中出错时,也会发生这种情况。在我的例子中,我正在使用一个向我发送消息的API

“请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“null”。响应的HTTP状态代码为401。“


当我在POST请求中发送错误的用户名或密码进行登录时。

如果你们在sails.js中遇到此问题,只需将cors.js设置为将授权作为允许的标题

/***************************************************************************
*                                                                          *
*CORS请求应允许哪些标头?这仅用于*
*对飞行前请求的响应*
*                                                                          *
***************************************************************************/
标题:“授权”//这一行在这里
不要使用$http.get('abc/xyz/getSomething'),尝试使用 $http.jsonp('abc/xyz/getSomething')


你看到选项响应上的访问控制允许方法标题了吗?确实。允许所有方法。谢谢。在Firefox中工作得很好。你有关于此错误的更多信息吗?不是真正的错误,但更多是因为安全原因。请看:我在其他浏览器中尝试过,它成功了@为什么chrome这么说:(当您准备部署应用程序以供更多用户使用时,您应该怎么做?大多数人使用Chrome,处理此问题的正确方法是什么?这不是一个解决方案!!!这与CORS有关,而不仅仅是浏览器…这是一个安全约束。您可以始终在服务器上启用CORS。这基本上是我遇到的问题-谢谢提醒。谢谢-你帮我解决了我自己的问题。我也有同样的症状。在我的例子中,我使用Amazon API网关并从Chrome内部的AngularJS调用它。我缺少了一个参数,就像@tacticurv建议的那样,但Chrome暗示它从未发表过文章,因为它在选项请求显然成功了。我发现额外的问题是API网关的“启用CORS”“按钮并没有完成一项完整的工作。它只在200个OK响应中添加了标题,并在400和500个错误响应中遗漏了标题。这些错误随后从chrome inspector中遗漏了!@charltones事实上,自从我发布了我一直使用的
chrome://net-internals/#events
检测像这样的错误
<filter>
    <filter-name>simpleCORSFilter</filter-name>
    <filter-class>
        com.abc.web.controller.general.SimpleFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>simpleCORSFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
     return{
            getList:function(){
                return $http.jsonp('http://localhost:8080/getNames');
            }
        }