草庐IT

javascript - 跨源资源共享 (CORS) 和 Javascript

coder 2024-12-09 原文

作为示例,让我们采用此 url:http://api.duckduckgo.com/?q=computer&format=json(此服务器上未启用 CORS!)

  1. 我们可以从任何流行的浏览器访问此 URL 的内容作为普通 URL,浏览器打开此 URL 没有问题,服务器也没有返回任何错误。

  2. 像 PHP/RoR 这样的服务器端语言可以从该 URL 中获取内容,而无需添加任何额外的 header 或特殊的服务器设置。我使用了以下 PHP 代码,它非常有效。

    $url='http://api.duckduckgo.com/?q=computer&format=json';
    $json = file_get_contents($url);
    echo $json;
    
  3. 我刚开始使用 javascript 框架 AngularJS。我使用了以下代码...

    delete $http.defaults.headers.common['X-Requested-With'];
    var url="http://api.duckduckgo.com/?q=computer&format=json";
    $http.get(url)
         .success(function(data) {
             $scope.results=data;
          })
    

    使用上面的 AngularJS 代码,我收到以下错误:

    XMLHttpRequest cannot load http://api.duckduckgo.com/?q=computer&format=json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.

  4. AngularJS 使用 JQuery,所以我在 JQuery 中使用以下代码尝试了同样的方法:

    var url="http://api.duckduckgo.com/?q=computer&format=json";
    $.getJSON(url , function( data ) {
        console.log(data);
    });
    

    这也产生了与 AngularJS 代码相同的错误。

  5. 然后我的进一步研究让我明白它实际上并不特定于 JQuery 和 AngularJS。这两个都从 Javascript 继承了这个问题!



所以我的问题不是 CORS 是什么。我的问题是

  1. 我的理解是,无论是网络浏览器还是 PHP/RoR 或 Javascript 框架,都通过相同的 http 或 https 向 URL 发出请求,对吗?当然,是的。那么为什么当请求来自 javascript 时 http 必须更安全? http 和服务器如何知道请求来自 javascript?

  2. 当网络浏览器可以打开一个 URL 并且 PHP/RoR(或任何服务器端语言)可以访问该 URL 而无需任何额外的设置/ header 时,为什么 AngularJS、JQuery(或一个词)不能javascript) 访问该 URL,除非服务器设置了请求 root 的 Access-Control-Allow-Origin header ?

  3. Javascript 中缺少的特殊功能(PHP/RoR 具有和)是什么,以至于它无法在可以打开该 URL 而地址栏没有任何问题的相同浏览器中访问相同的 URL?

顺便提一下,我基本上是一名 iOS 开发人员,最近开始学习 Web 开发,特别是 AngularJS。所以我很好奇这一切到底是怎么回事,为什么!

最佳答案

出于安全原因,它在 javascript 中被禁用。这是一种情况:

  • 假设 Facebook 有一个“在时间轴上发布消息”api,需要对用户进行身份验证。
  • 当您访问 badsite.com 时,您已登录 Facebook。
  • badsite.com 使用 javascript 调用 Facebook api。由于浏览器向 Facebook 发出有效请求,您的身份验证 cookie 已发送,Facebook 接受该消息并在您的时间轴上发布 badsite 的广告。

这不是服务器的问题,因为 badsite.com 的服务器无法访问您的 Facebook 身份验证 cookie,也无法代表您伪造有效请求。

关于javascript - 跨源资源共享 (CORS) 和 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21885765/

有关javascript - 跨源资源共享 (CORS) 和 Javascript的更多相关文章

  1. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  2. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  3. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  4. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  5. ruby - Chef LW 资源属性默认值如何引用另一个属性? - 2

    我正在尝试将一个资源属性的默认值设置为另一个属性的值。我正在为我正在构建的tomcat说明书定义一个资源,其中包含以下定义。我想要可以独立设置的“名称”和“服务名称”属性。当未设置服务名称时,我希望它默认为为“名称”提供的任何内容。以下不符合我的预期:attribute:name,:kind_of=>String,:required=>true,:name_attribute=>trueattribute:service_name,:kind_of=>String,:default=>:name注意第二行末尾的“:default=>:name”。当我在Recipe的新block中引用我

  6. ruby - 在模块/类之间共享全局记录器 - 2

    在许多ruby​​类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..

  7. ruby - 如何使用 cucumber 在场景之间共享状态 - 2

    我有一个功能“从外部网站导入文章”。在我的第一个场景中,我测试从外部网站导入链接列表。Feature:ImportingarticlesfromexternalwebsiteScenario:Searchingarticlesonexample.comandreturnthelinksGiventhereisanImporterAnditsURLis"http://example.com"Whenwesearchfor"demo"ThentheImportershouldreturn25linksAndoneofthelinksshouldbe"http://example.com/d

  8. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan

  9. ruby - Sinatra 路由中定义的全局变量是否在请求之间共享? - 2

    假设我有:get'/'do$random=Random.rand()response.body=$randomend如果我每秒有数千个请求到达/,$random是否会被共享并“泄漏”到上下文之外,或者它会像getblock的“本地”变量一样?我想如果它是在get'/'do的上下文之外定义的,它确实会被共享,但我想知道在ruby​​中是否有我不知道的$机制。 最佳答案 ThispartoftheSinatraREADMEaboutscopeisalwayshelpfultoread但是,如果您只需要为请求保留变量,那么我认为我建议使用

  10. javascript - jQuery 的 jquery-1.10.2.min.map 正在触发 404(未找到) - 2

    我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文

随机推荐