【发布时间】:2015-06-16 04:13:22
【问题描述】:
我编写了一个 Angular 应用程序,它是 Rails 应用程序的一部分。这个想法是第三方网站可以在他们的页面中创建一个脚本标签,指向他们希望我的应用程序出现的我的 rails 方法。
在我的 Rails 控制器中,我有返回原始 javascript 的逻辑,如下所示...
def job_board
div_init_script =
"var jobBoardDiv=document.getElementById('#{div_id}');" \
"jobBoardNgView=document.createElement('ng-view');" \
'jobBoardDiv.appendChild(jobBoardNgView);' \
"jobBoardDiv.setAttribute('ng-app','jobBoard');"
url = Rails.application.config.api_url
contents = Rails.cache.fetch 'api_js' do
file_contents = File.read("#{Rails.root}/public/app/app.js")
"(function(){ var hookApiUrl = { apiUrl: '#{url}'};#{file_contents}})();"
end
send_data div_init_script + contents, type: 'text/javascript', disposition: 'inline'
end
因此,回顾一下,我的网站返回在另一个网站内执行的原始 javascript,并且我的 javascript 获取/发布到我网站的 api 端点。
我发现这个要点是为了让 CORS 工作 - https://gist.github.com/dhoelzgen/cd7126b8652229d32eb4 - 当我在 Rails 服务器中本地运行它时,所有的标头都被添加到每个请求中。
但是,当我设置在本地主机上运行页面的场景时,CORS 将不起作用,该页面的脚本 src 设置为我网站的 job_board 端点。根据我的阅读,Angular 向 $http.get 和 post 方法添加了预检检查,上面链接的 gist 中的代码的预检部分“应该”处理。但是当我在运行我的应用程序时查看控制台时,我没有看到任何对失败调用的预检检查。只需一个没有添加访问控制标头的调用。我不确定现在还能去哪里。任何人都可以提出任何建议吗?谢谢。
【问题讨论】:
-
Angular 没有进行飞行前检查。如果你使用 Fiddler,你会看到一个 OPTIONS 调用——你的服务器需要正确处理这个
-
也许这里的一些答案会有一些用处:stackoverflow.com/questions/24134117/…
-
我想我离问题越来越近了,但还没有那么多解决方案。进行初始脚本调用时,它会将 cookie 保存到客户端。 Angular 有 $httpProvider.defaults.withCredentials = true;处理请求中的 cookie。但是,如果凭据为真,我的来源就不能是“*”。
标签: angularjs ruby-on-rails-4 cors