请耐心等待,这需要一些解释。
我正在帮助构建一个混合移动网络应用程序。主要代码库是 HTML5 和 JavaScript,它们将被包装在原生移动 Web View (类似于 Phonegap)中。
部分功能要求应用程序将信息发布到由我们的一位客户控制的网络服务。更改此 Web 服务的范围很小,因为其他人正在使用它。我们使用 HTTP POST 发送 JSON 并从服务器接收响应。此响应的一部分是一个 JSESSIONID cookie,它管理我们与服务器的 session 。初始initSession()之后调用时,我们需要在每个 (AJAX) 请求中发送 JSESSIONID cookie。
当部署在移动设备上时,网络应用程序被包装在 native WebView 中,通过浏览到 file:///path/to/app/index.html 启动网络应用程序。 .
我们尝试的第一件事是要求我们的客户设置 Access-Control-Allow-Origin: *在他们的响应 header 中允许 CORS。然后我们尝试发布到服务器:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback
});
监控请求,很明显没有包含 cookie。仔细观察有一个 special section in the CORS spec for dealing with user credentials ,其中包括 session cookie。所以我修改了 AJAX 调用以包含以下内容:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback,
xhrFields { withCredentials: true }
});
另一个错误,这次来自浏览器。更多阅读产生了以下内容:
If the third party server did not respond with an
Access-Control-Allow-Credentials: trueheader the response would be ignored and not made available to web content.Important note: when responding to a credentialed request, the server must specify a domain in the
Access-Control-Allow-Originheader, and cannot use wild carding.
所以我们需要更改服务器的 header 以包含Access-Control-Allow-Credentials: true和 Access-Control-Allow-Origin到我们的起源。
我们终于到了我的问题:when loading a web page using the file:// protocol , Origin从 Web View 发送的请求 header 设置为 null .因此它不能被服务器解析,所以服务器不能在 Access-Control-Allow-Origin 中设置它。 .但是如果服务器不能设置Access-Control-Allow-Origin到*以外的东西我们无法发送凭证,包括 cookie。
所以我卡住了。该怎么办? I saw a similar question posted here但我真的不明白建议的答案。任何帮助将不胜感激!
最佳答案
我意识到这个问题很老了,但我想无论如何我都会参与其中。对于 CORS 请求,浏览器会对它们进行预检。这意味着 - 无论您使用何种 $.ajax() 方法,都会向服务器发送一个 OPTIONS 请求。
这个预检 OPTIONS 请求实际上是在说:
"Hey there, foreign-server-from-some-other-domain, I want to send you a not-simple request (simple req's are not preflighted). My not-simple request going to have these kinds of headers and content type and so on. Can you let me know if this is okay?"
然后服务器将执行它所做的任何操作(可能检查某些配置或数据库)并以允许的来源、允许的 header 和/或允许的方法进行响应。
最后 - 如果预检 OPTIONS 请求收到允许实际 $.ajax() 方法运行的响应 - 它运行。
CORS 与 JSONP 不同。
综上所述 - 虽然 withCredentials 预检成功需要响应携带 Access-Control-Allow-Credentials header (如问题中所述),即 IN添加 Access-Control-Allow-Origins 和 Access-Control-Allow-Methods 值,其中必须包括预期请求的各个方面。
例如 - 如果您从来源 http://foo-domain.com 发出 CORS POST 请求, header somevalue 到http://bar-domain.com,预检 OPTIONS 请求将发出,以便向 http://发出实际的发布请求bar-domain.com,OPTIONS 请求需要接收一个包含 http 的 。这可以是原始名称本身或 Access-Control-Allow-Origins 值的响应://foo-domain.com*。响应还需要有一个包含 POST 的 Access-Control-Allow-Methods 值。这也可能是 *。最后,如果我们希望我们的 somevalue header 被允许,则响应必须包含一个 Access-Control-Allow-Headers 值,其中包含我们的 somevalue header 键或 *。
回过头来 - 如果您无法控制服务器,或者无法让服务器允许您的 CORS 请求,您可以始终使用 JSONP 或某些 urlEncoded 数据类型和/或发出没有自定义 header 的简单请求。 GET、HEAD 和完整的 POST 请求通常是简单的请求。
关于javascript - 使用文件 ://在本地加载的来自移动 WebView 的 CORS cookie 凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9103876/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题