Javascript XMLHttpRequest No';访问控制允许原点';请求的资源上存在标头
因此,关于StackOverflow,有几个问题可以解决这个错误,但在我检查的10-15个问题中,我找不到一个解决问题的方法 我正在远程服务器上运行Angular应用程序(端口9000)和Rails应用程序(端口3000)。angular应用程序通过post请求向rails应用程序发送请求 当发出请求时,Javascript控制台显示以下错误消息: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
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>