Javascript XMLHttpRequest No';访问控制允许原点';请求的资源上存在标头

Javascript XMLHttpRequest No';访问控制允许原点';请求的资源上存在标头,javascript,ruby-on-rails,angularjs,Javascript,Ruby On Rails,Angularjs,因此,关于StackOverflow,有几个问题可以解决这个错误,但在我检查的10-15个问题中,我找不到一个解决问题的方法 我正在远程服务器上运行Angular应用程序(端口9000)和Rails应用程序(端口3000)。angular应用程序通过post请求向rails应用程序发送请求 当发出请求时,Javascript控制台显示以下错误消息: XMLHttpRequest cannot load http://0.0.0.0:3000/api/query. No 'Access-Contr

因此,关于StackOverflow,有几个问题可以解决这个错误,但在我检查的10-15个问题中,我找不到一个解决问题的方法

我正在远程服务器上运行Angular应用程序(端口9000)和Rails应用程序(端口3000)。angular应用程序通过post请求向rails应用程序发送请求

当发出请求时,Javascript控制台显示以下错误消息:

XMLHttpRequest cannot load http://0.0.0.0:3000/api/query. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://10.241.16.159:9000' is therefore not allowed access. 
从我所读到的内容来看,我需要对我的Rails应用程序进行一些更改,以便它能够接受来自其他服务器的连接(这似乎很奇怪,因为两个应用程序都在同一个ec2实例上运行)

我尝试添加一行,如

  skip_before_filter :verify_authenticity_token
对于我的rails控制器,这似乎没有任何效果


如何解决此错误?

在app/controllers/application\u controller.rb中:

before_filter :add_allow_credentials_headers

def add_allow_credentials_headers                                                                                                                                                                                                                                                        
  # https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#section_5                                                                                                                                                                                                      
  #                                                                                                                                                                                                                                                                                       
  # Because we want our front-end to send cookies to allow the API to be authenticated                                                                                                                                                                                                   
  # (using 'withCredentials' in the XMLHttpRequest), we need to add some headers so                                                                                                                                                                                                      
  # the browser will not reject the response                                                                                                                                                                                                                                             
  response.headers['Access-Control-Allow-Origin'] = request.headers['Origin'] || '*'                                                                                                                                                                                                     
  response.headers['Access-Control-Allow-Credentials'] = 'true'                                                                                                                                                                                                                          
end 

def options                                                                                                                                                                                                                                                                              
  head :status => 200, :'Access-Control-Allow-Headers' => 'accept, content-type'                                                                                                                                                                                                         
end
在config/routes.rb中:

match '*any' => 'application#options', :via => [:options]
注意,这是对选项请求的响应,如果您的角度前端正在执行POST请求,您将需要这些选项请求。我在访问控制允许凭据方面所做的工作是针对我的应用程序,以便从前端发送cookie


我强烈建议您阅读上面代码中mozilla链接中的文档。它对CORS有非常透彻的解释。您可能会发现上面的代码对于您的目的来说过于宽松。

如果您还没有读过它,那么让我告诉您一些问题是什么

你的应用程序中有一个问题

--

CORS(CORS来源资源共享)

当您使用XHR()访问另一台服务器上的时,您的应用程序(尽管我不确定如何)将默认拒绝对请求资源的访问

发生这种情况的原因是为了确保只有某些数据/资源通过XHR可用,这也是为什么它主要用于API之类的应用程序

--

机架式CORS

无论如何,您需要允许在Rails应用程序中访问Java应用程序——我个人建议使用gem:


这将“允许”来自不同应用程序的请求,为您解决问题。

尝试此代码

  <httpProtocol>
          <customHeaders>
           <add name="Access-Control-Allow-Origin" value="*" />
           <add name="Access-Control-Allow-Headers" value="Content-Type" />
           <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS"/>
          </customHeaders>
     </httpProtocol>

inside the <system.webServer> 

内部

它们都在同一个EC2实例上并不重要。它们在不同的端口上,CORS特别关注被命中的URL,因为它们都在不同的端口上,所以它们是不同的URL。请尝试以下方法:有没有一种方法可以让我的rails服务器接受所有CORS请求,即使这会牺牲一些安全性?不知道如何在rails中实现,但当我在PHP上遇到这个问题时,我不得不在我的php文件中添加一些标题行:
header('Access-Control-Allow-Origin:');标题('Access-Control-Allow-Methods:GET、POST、OPTIONS');标题('Access-Control-Allow-Headers:Origin,X-request-With,Content-Type,Accept')您是否尝试过此
头文件['Access-Control-Allow-Origin']=request.headers[“HTTP_Origin”]
我应该在哪里包含该代码,HEX4949?行资源“api/jquery”是什么意思?如果我想从angularjs使用$http而不是从jquery使用$.post,我应该保留这行代码吗?我仍然从jquery和angular中得到相同的错误。为什么这可以解决问题?我把它添加到我的应用程序控制器中,现在我的客户端框架应用程序可以使用这个api了。
  <httpProtocol>
          <customHeaders>
           <add name="Access-Control-Allow-Origin" value="*" />
           <add name="Access-Control-Allow-Headers" value="Content-Type" />
           <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS"/>
          </customHeaders>
     </httpProtocol>

inside the <system.webServer>