javascript加RoR实现JSONP

我们知道不同域中的js代码受同源策略的限制,不同域中的AJAX同样受此限制,不过使用html中的script远程脚本可以跳过该限制,下面我们实际看一下利用RoR和js如何实现所谓的JSONP。
这里只是简单地演示一下功能,并没有严格的实现JSONP,如果是那样需要用一个函数包容JSON对象主体:

some_function([1,2,{a:1,b:11}])

而这里的包容函数名称也不需要定死,而是可以通过http参数告知web服务器,比如可以用以下url的方式:

http://some_address/some_service?arg0=xxx&arg1=xxx&json=some_function
//或者是
http://some_address/some_service?json=some_function

当然这只是一个约定,你可以用其他任意的方式告知服务器。
我们下面实现一个不严格的JSONP。首先用如下命令创建新的RoR网站:

rails new ws
rails g controller Service func0

在Service控制器的func0方法中增加如下代码:

def func0
    respond_to do |format|
      format.js
    end
end

然后在rails的app/views/service目录中添加func0.js.erb文件,内容如下:

alert("hello RoR!");
var add_elt = "<h1>hello RoR!!!";
document.write(add_elt);

注意因为我们在func0中返回的response不是一个html页面,所以正常的通过url访问func0会出错的:

//用以下url访问出错
http://127.0.0.1:3000/service/func0

下面我们建立一个本地html文件,内容如下:

<!DOCTYPE html>
<html>
<head>
    <title>test JSONP fundation</title>
    <script src="http://127.0.0.1:3000/service/func0?msg=hello" type="text/javascript"></script>
</head>
<body>

</body>
</html>

如果直接打开该页面会出错,因为你在服务器端没对此action关闭外联保护,在RoR中显示如下错误:

Started GET "/service/func0?msg=hello" for 127.0.0.1 at 2015-03-29 10:25:27 +0800
Processing by ServiceController#func0 as */*
  Parameters: {"msg"=>"hello"}
  Rendered service/func0.js.erb (0.4ms)
Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.
Completed 422 Unprocessable Entity in 9ms

ActionController::InvalidCrossOriginRequest (Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript embedding.):

我们只需要对func0 action关闭保护即可:

class ServiceController < ApplicationController
  protect_from_forgery except: :func0

  def func0
    respond_to do |format|
      format.js
    end
  end
end

注意config中的保护也是要关闭的:

config.action_controller.allow_forgery_protection = false

然后再次在浏览器中打开本地html文件,成功执行了web服务器中传回的js脚本,该脚本能做的事只受限于想象力而已。

时间: 2024-09-27 06:58:13

javascript加RoR实现JSONP的相关文章

JavaScript中模拟实现jsonp

  这篇文章主要介绍了JavaScript中模拟实现jsonp,本文直接给出实现代码,代码中包含详细注释,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 6

Javascript加载速度慢的解决方案

 在网站里面会加载一些js代码,统计啊,百度广告等等,结果弄得页面加载速度很慢,下面有个不错的解决方法,大家可以参考下 通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊,一堆,最后弄得页面加载速度很慢,很慢.  解决办法:换一个js包含的方式,让javascript加载速度倍增.  把通常加载方式:   代码如下: <script src="xxxx.js"></script>    改变成:   代码如下: &l

Javascript加载速度慢的解决方案_javascript技巧

通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊,一堆,最后弄得页面加载速度很慢,很慢. 解决办法:换一个js包含的方式,让javascript加载速度倍增. 把通常加载方式: 复制代码 代码如下: <script src="xxxx.js"></script> 改变成: 复制代码 代码如下: <script type="text/javascript"> document.writ

《Web测试囧事》——1.4 利用JavaScript加载的漏洞提前购买抢购商品

1.4 利用JavaScript加载的漏洞提前购买抢购商品 自从小米手机推出以来,抢购风潮在各类网站上盛行起来,小蔡测试的网站自然也不能免俗,项目组开发的网站也包含了抢购功能. 对于抢购来说,只有到了特定的时间后,商品才会开放并允许抢购,并且抢购网页的代码里使用的时间会定期和服务器进行同步. 小蔡设计了丰富和全面的测试用例,在执行基础测试用例过程中没有发现抢购功能的Bug,不过在进行多地区和多语言的性能测试时,她发现了一个功能上的漏洞,发现漏洞的过程是这样的. 在执行性能测试时,需要选取不同国家

javascript加超链接的问题

问题描述 javascript加超链接的问题 下面的这个东西目前在.js文件内,我希望这两个省能有超链接 var chinaMapConfig = { width: 565, height: 475, shapes: { heilongjiang: 'M464.838,96.639l6.787-1.19l2.854,5.241l4.285,3.095l2.856-1.188h2.386l4.285-2.501l3.094,3.094l2.024,0.357l5.357-2.023l3.813,2

script.js —— 异步的 JavaScript 加载和依赖管理

script.js 详细介绍script.js 是一个异步的 JavaScript 加载器和依赖管理器.支持的浏览器包括: IE 6+ Opera 10+ Safari 3+ Chrome 1+ Firefox 2+ 示例代码: // load jquery and plugin at the same time. name it 'bundle' $script(['jquery.js', 'my-jquery-plugin.js'], 'bundle') // load your usage

javascript加载xml 并解析各节点的值(实现方法)_javascript技巧

实例如下: var xmlDoc = null; function LoadXml(xmlPath) { try { if (window.ActiveXObject) { xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); } } catch (e) { try { xmlDoc = document.implementation.createDocument("", "", null); } cat

Javascript加载速度慢解决办法

通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊,一堆,最后弄得页面加载速度很慢,很慢. 解决办法:换一个js包含的方式,让javascript加载速度倍增. 把通常加载方式:  代码如下 复制代码 <script src="xxxx.js"></script> 改变成:  代码如下 复制代码  <script type="text/javascript">  document.wr

高性能JavaScript:加载和执行

       在步入正题之前为大家介绍一本很好的书<高性能JavaScript>大家不妨看一下,在本文中我为大家分享我看这本书的一些收获. 阻塞特性:        JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时做其他任何事情,无论其代码是内嵌的还是外部的. 脚本位置:       浏览器在碰到一个引入外部JS 文件的<script>标签时会停下所有工作来下载并解析执行它,在这个过程中,页面渲染和用户交互完全被阻塞了,为了避免页面加载时的停顿甚至空白页的出现,