草庐IT

javascript - IE8 - IE10 跨域 JSONP cookie 头疼

coder 2025-02-23 原文

由于完全不受我控制的决定,我处于以下情况:

  • 我在catalog.org 上有一个产品列表
  • 单击产品上的“添加到购物车”按钮向 secure.com/product/add/[productKey] 发出 AJAX JSONP 请求,该请求将购物车记录保存到数据库中,使用购物车 ID 设置 cookie,并返回 true响应(如果失败则为 false)
  • 回到catalog.org,如果响应为真,则会向secure.com/cart/info 发出另一个AJAX JSONP 请求,该请求读取购物车ID cookie,获取记录,并返 repo 物车中的商品数量
  • 再次返回 catalog.org,读取响应并更新页面上的元素,显示购物车中的商品数量(如果有)
  • 此时,单击catalog.org 上的“转到购物车”按钮会在secure.com 上显示购物车摘要

  • 这在 Firefox 17、Chrome 32 和 IE 11 中运行良好。它也适用于 IE8 - IE10 在我们的开发和测试环境中,其中 catalog.org 是 catalog.development.com 和 catalog.test.com,secure.com 是安全的。 development.com 和 secure.test.com 分别。

    但是,在我们部署到生产环境后,这在 IE8 - IE10 中停止工作。将产品添加到购物车后,购物车中的商品数量会在 catalog.org 上成功更新。然后,单击 catalog.org 上的“转到购物车”按钮后,secure.com 上的购物车摘要没有显示任何内容,因为它无法读取 cookie。在 IE 开发者工具中转到缓存 >“查看 cookie 信息”显示没有购物车 ID cookie。它应该在那里,就像在其他浏览器以及我们的开发和测试环境中一样。

    我相信正在发生的事情是 IE 阻止了第三方 cookie。我们已向 secure.com 上的所有请求添加了 P3P 紧凑策略 header ,但仍未设置 cookie。我们正在设置的标题是:
    P3P: CP="CAO PSA OUR"
    

    为什么在 IE8 - IE10 中添加紧凑策略 header 不解决这个问题?如何修复此问题以在所有版本的 IE 中工作?

    解决方案

    下面发布了几个好主意。我接受了@sdecima,因为它听起来最有前途。我们最终结合了其中一些想法,但设法避免了 XDomainRequest:

    • Clicking the "Add to Cart" button on a product makes an AJAX JSONP request to secure.com/product/add/[productKey], which saves the cart record to the database, sets a cookie with the cart ID, and returns a true response (or false if it failed)


    我们更改了 secure.com/product/add 上的操作,以返回一个带有指示成功或失败的 bool 值和购物车 ID 的 JSON 对象。

    • Back on catalog.org, if the response is true, another AJAX JSONP request is made to secure.com/cart/info, which reads the cart ID cookie, fetches the record, and returns the number of items in the cart


    我们更改了回调函数以检查响应对象中的两个属性。如果成功为真并且购物车 ID 存在,我们将在页面上创建一个隐藏的 iframe。 src iframe 的属性设置为我们添加到 secure.com 的新端点。此操作接受购物车 ID 参数并保存购物车 ID cookie。我们不再需要在 secure.com/product/add 操作中保存 cookie。

    接下来,我们更改了 secure.com/cart/info 上的操作以接受购物车 ID 参数。此操作将使用购物车 ID 参数(如果存在)来获取购物车信息,否则仍会尝试读取 cookie。如果我们可以保证 iframe 已完成加载并且 cookie 已保存在 secure.com 上,则无需进行此额外检查,但由于浏览器安全限制,我们无法知道 iframe 何时在 catalog.org 上完成加载。

    最后,P3P header CP="CAO PSA OUR"这仍然需要在 IE7 - IE10 中工作。 (是的,这现在也适用于 IE7 :)

    我们现在有一个解决方案(尽管非常复杂),用于保存和访问跨域 cookie,它适用于所有主要浏览器,至少在我们可以可靠测试的时候是这样。

    我们可能会对此进行更多重构。一方面,对 secure.com/cart/info 的第二个 AJAX JSONP 请求此时是多余的,因为我们可以将原始请求中所需的所有信息返回到 secure.com/product/add 操作(更改的附带好处)该操作返回一个 JSON 对象 - 另外我们可以返回一条错误消息,指出如果出现错误则失败的确切原因)。

    最佳答案

    简而言之

    Cookie 不会在 IE 8 和 9 上通过跨域请求。不过它应该适用于 IE 10 和 11。

    IE 8 和 9

    在 IE8/9 上 XMLHttpRequest部分支持 CORS和跨域请求是在 XDomainRequest object 的帮助下进行的。它不会随每个请求发送 cookie。

    您可以在以下官方 MSDN 博客文章中阅读有关此内容的更多信息:
    http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

    特别是这部分:

    5 . No authentication or cookies will be sent with the request

    In order to prevent misuse of the user’s ambient authority (e.g. cookies, HTTP credentials, client certificates, etc), the request will be stripped of cookies and credentials and will ignore any authentication challenges or Set-Cookie directives in the HTTP response. XDomainRequests will not be sent on previously-authenticated connections, because some Windows authentication protocols (e.g. NTLM/Kerberos) are per-connection-based rather than per-request-based.



    浏览器 10+

    从 IE10 开始,完整 CORS支持已添加到 XMLHTTPRequest并且它应该可以在来自服务器的响应(希望在浏览器上设置 cookie)上使用正确的 Access-Control-Allow-Origin header 属性正常工作。

    更多关于这里的信息:
    http://blogs.msdn.com/b/ie/archive/2012/02/09/cors-for-xhr-in-ie10.aspx
    和这里:
    http://www.html5rocks.com/en/tutorials/cors/

    IE 8 和 9 上的解决方法

    在 IE8/9 上解决这个问题的唯一方法是引用相同的 MSDN post如上:

    Sites that wish to perform authentication of the user for cross-origin requests can use explicit methods (e.g. tokens in the POST body or URL) to pass this authentication information without risking the user’s ambient authority.

    关于javascript - IE8 - IE10 跨域 JSONP cookie 头疼,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20667111/

    有关javascript - IE8 - IE10 跨域 JSONP cookie 头疼的更多相关文章

    1. 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发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

    2. 由于 libgmp.10.dylib 的问题,Ruby 2.2.0 无法运行 - 2

      我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro

    3. ruby - ri 有空文件 – Ubuntu 11.10, Ruby 1.9 - 2

      我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da

    4. ruby-on-rails - gem install rmagick -v 2.13.1 错误 Failed to build gem native extension on Mac OS 10.9.1 - 2

      我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/

    5. ruby - 安装 tiny_tds 在 mac os 10.10.5 上出现错误 - 2

      我正在使用macos,我想使用ruby​​驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System

    6. ruby - rails 3.2.2(或 3.2.1)+ Postgresql 9.1.3 + Ubuntu 11.10 连接错误 - 2

      我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat

    7. 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

    8. ruby-on-rails - 在 osx 10.9.3 上使用 RVM 安装 ruby​​-1.9.3-p547 时出错 - 2

      如何解决这个错误:$rvminstall1.9.3Searchingforbinaryrubies,thismighttakesometime.Nobinaryrubiesavailablefor:osx/10.9/x86_64/ruby-1.9.3-p547.Continuingwithcompilation.Pleaseread'rvmhelpmount'togetmoreinformationonbinaryrubies.Checkingrequirementsforosx.Certificatesin'/usr/local/etc/openssl/cert.pem'arealr

    9. u盘安装系统(win10为例) - 2

      下载微PE工具箱进入官网下载微PE工具箱-下载 安装好后,打开微PE工具箱客户端,选择安装PE到U盘 PE壁纸可选择自己喜欢的壁纸,勾选上包含DOS工具箱,个性化盘符图标 下载原版系统进入网站下载镜像NEXT,ITELLYOU如果没有账号,注册一下就好进入选择开始使用选择win10 这里我们选择消费者版,用迅雷把BT种子下载下来 下面的两个盘符,是PE工具箱安装进U盘后,分成的盘符,注意EFI的盘符,这里面不能删东西,也不能添东西,另一个盘符可以当做正常的U盘空间使用,我们现在需要把下载下来的景象文件复制到正常的U盘空间中去 这个时候我们的系统U盘就只做好了 安装系统我们将U盘插入电脑,开机,

    10. ruby-on-rails - OSX 10.7.5 - Ruby on Rails LoadError : Could not open library 'sodium' : dlopen(sodium, 5) - 2

      输入rakedb:create后我得到:LoadError:Couldnotopenlibrary'sodium':dlopen(sodium,5):imagenotfound.Couldnotopenlibrary'libsodium.dylib':dlopen(libsodium.dylib,5):imagenotfound这里还有一些输出。/Users/Mao/.rvm/gems/ruby-2.0.0-p451/gems/ffi-1.9.3/lib/ffi/library.rb:133:in`blockinffi_lib'/Users/Mao/.rvm/gems/ruby-2.0

    随机推荐