最佳答案
ajax 调用是从客户端直接向服务器发出的实际 HTTP 请求。 Ajax 调用可以是同步的(阻塞直到它们完成)或异步的。由于同源安全保护,除非目标服务器明确允许使用 CORS 的跨源请求,否则只能对网页来自的同一服务器进行 ajax 调用。
JSONP 调用是使用 <script> 的一个有趣的技巧。允许跨源通信的标签。在 JSONP 调用中,客户端创建一个脚本标记并在其上放置一个带有 callback=xxxx 的 URL。查询参数就可以了。该脚本请求(通过脚本标签插入)由浏览器发送到外部服务器。浏览器只是认为它正在请求一些 javascript 代码。然后,服务器为此调用创建了一些特殊的 javascript,在该 javascript 返回时将由浏览器执行,服务器将函数调用置于 callback=xxxx 中命名的函数中。查询参数。通过将数据传递给该函数来定义变量,服务器可以将数据传送回客户端。对于 JSONP,客户端和服务器必须在 JSONP 调用如何工作以及如何定义数据方面进行合作。客户端无法对不明确支持 JSONP 的服务器进行 JSONP 调用,因为服务器必须构建完全正确类型的 JSONP 响应,否则它将无法工作。
因此,这两种通信方式的工作方式完全不同。只有 ajax 调用可以是同步的。按性质<script>标签插入,JSONP 调用总是异步的。
在 Ajax 调用中,响应在 ajax 事件处理程序中返回。
在 JSONP 调用中,当返回的 Javascript 调用您的函数时会出现响应。
在某些方面,JSONP 是一个绕过跨域安全机制的安全漏洞。但是,您只能调用明确选择支持类似 JSONP 机制的服务器,因此如果服务器不希望您能够跨域调用它,它可以通过不支持 JSONP 来阻止它。您不能对这些其他服务器进行常规 ajax 调用。
浏览器制造商无法真正关闭这个漏洞,因为如果他们做了无数网页,就会破坏已经使用 JSONP 或从其他域加载脚本的网页。例如,Web 上使用 Google 或 Microsoft CDN 之外的 jQuery 的每个页面都会中断,因为不允许浏览器从跨域域下载 javascript。
JSONP 主要是作为一种能够发出跨域请求的变通方法而发明的。但是,由于 JSONP 需要明确的服务器支持才能工作,因此这并不是真正的安全问题,因为 JSONP 调用只能对明确决定允许这种类型的跨源调用的服务器进行。现在 JSONP 的使用比以前少得多,因为 CORS 被发明为一种更优雅的控制/允许方式。 CORS 代表 Cross Origin Resource Sharing它为目标服务器提供了一种方法,可以准确地告诉 Web 浏览器允许哪种类型的跨源请求,甚至可以告诉它哪些网页域可以发出此类请求。它具有比 JSONP 更精细的控制,并且所有现代浏览器现在都支持 CORS。
下面是一个跨域调用如何导致问题的示例。如果您可以从任何其他网页加载任意网页或进行任意 ajax 调用,那么假设您已经在其他浏览器窗口中登录到 Yahoo 上的网络邮件界面。这意味着您的 cookie 设置为允许来自您的浏览器的请求从 Yahoo 获取数据。如果允许其他网页中的 javascript 向 Yahoo 发出网络邮件请求(这将自动附加您的 cookie),那么它可以获取您的所有网络邮件数据并将其发送回它自己的站点。一个网站可以窃取任何其他网站的所有登录数据。所有的网络安全都会被破坏。
但是,按照我们今天的方式,只要 Yahoo 不支持使用相同 Web cookie 的 JSONP 接口(interface),它就可以避免未经授权的 JSONP 请求。
这里有一些关于跨域 ajax 的危险以及为什么必须防止它的其他好文章:
Why the cross-domain Ajax is a security concern?
Why Cross-Domain AJAX call is not allowed?
Why are cross-domain AJAX requests labelled as a "security risk"?
关于javascript - 我不明白 JSONP 与 AJAX 有何不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10289789/
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我有一个电子邮件表格。但是我正在制作一个测试电子邮件表单,用户可以在其中添加一个唯一的电子邮件,并让电子邮件测试将其发送到该特定电子邮件。为了简单起见,我决定让测试电子邮件通过ajax执行,并将整个内容粘贴到另一个电子邮件表单中。我不知道如何将变量从我的HAML发送到我的Controllernew.html.haml-form_tagadmin_email_blast_pathdoSubject%br=text_field_tag'subject',:class=>"mass_email_subject"%brBody%br=text_area_tag'message','',:nam
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我有这个: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
我看到有关未找到文件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功能。修复:获取文
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如
出于某种原因,我必须为Firefox禁用javascript(手动,我们按照提到的步骤执行http://support.mozilla.org/en-US/kb/javascript-settings-for-interactive-web-pages#w_enabling-and-disabling-javascript)。使用Ruby的SeleniumWebDriver如何实现这一点? 最佳答案 是的,这是可能的。而是另一种方式。您首先需要查看链接Selenium::WebDriver::Firefox::Profile#[]=
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。有没有学习Ajax(jQuery)和Rails3的好资源?
我是Ruby和Watir-Webdriver的新手。我有一套用VBScript编写的站点自动化程序,我想将其转换为Ruby/Watir,因为我现在必须支持Firefox。我发现我真的很喜欢Ruby,而且我正在研究Watir,但我已经花了一周时间试图让Webdriver显示我的登录屏幕。该站点以带有“我同意”区域的“警告屏幕”开头。用户点击我同意并显示登录屏幕。我需要单击该区域以显示登录屏幕(这是同一页面,实际上是一个表单,只是隐藏了)。我整天都在用VBScript这样做:objExplorer.Document.GetElementsByTagName("area")(0).click
我正在使用一个用RubyonRails构建的应用程序,目前错误处理非常差。如果通过ajax执行Controller方法,并且该方法导致500(或404或任何其他响应),则呈现500.html页面并将其作为AJAX请求的结果返回。显然,javascript不知道如何处理该HTML,网页看起来只是在等待响应。在AJAX调用期间发生错误时,rails是否有一种简单的方法来呈现error.rjs模板? 最佳答案 您可以在Controller的rescue_action或rescue_action_in_public方法中使用respond_