我们知道不同域中的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脚本,该脚本能做的事只受限于想象力而已。

javascript加RoR实现JSONP的更多相关文章

  1. 关于javascript跨域及JSONP的原理与应用

    同源策略,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略. 为什么需要同源策略,这里举个例子: 假 设现在没有同源策略,会发生什么事情呢? ...

  2. 原生JavaScript实现AJAX、JSONP

    相信大多数前端开发者在需要与后端进行数据交互时,为了方便快捷,都会选择JQuery中封装的AJAX方法,但是有些时候,我们只需要JQuery的AJAX请求方法,而其他的功能用到的很少,这显然是没必要的 ...

  3. 原生javascript加载运行

    原生javascript加载运行 (function(){ //TODO sometings }()); 在要运行相应代码的位置加入script标签,创建函数并自执行; 关于window.onload ...

  4. javascript加载顺序

    javascript加载顺序 <script type="text/javascript" src="jquery.js"></script& ...

  5. JSBinding + SharpKit / JavaScript 加载流程

    首先,现在的方案是游戏启动就加载全部的 JavaScript 代码. 先看下 StreamingAssets/JavaScript/ 文件夹下的目录结构:

  6. Javascript加载速度慢解决办法

    通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊,一堆,最后弄得页面加载速度很慢,很慢.解决办法:换一个js包含的方式,让javascript加载速度倍 ...

  7. 怎么样加快JavaScript加载和执行效率

    概览 无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载 ...

  8. jQuery(三) javascript跨域问题(JSONP解决)

    加油~ --WH 一.什么是javascript跨域问题? 域:服务器域名,唯一标识(协议,域名,端口)必须保证一致,说明域相同 跨域:在一个服务器上,去访问另一个服务器上,并且得到另一个服务器返回回 ...

  9. javascript javascript加载类似星座、血型的函数

     javascript加载类似星座.血型的函数 //加载血型 function bloodtypelaod(constellation) { var obj = document.getElement ...

随机推荐

  1. android 选项卡TabHost

    选项卡主要有TabHost.TabWiget和 FramentLayout3个组件组成,用于实现一个多标签的用户界面,通过他可以将一个复杂的对话分隔成若干个标签页,实现对信息的分类显示和管理.使用给组 ...

  2. 剑指Offer——网易笔试之不要二——欧式距离的典型应用

    剑指Offer--网易笔试之不要二--欧式距离的典型应用 前言 欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的 ...

  3. iOS下WebRTC音视频通话(二)-局域网内音视频通话

    这里是iOS 下WebRTC音视频通话开发的第二篇,在这一篇会利用一个局域网内音视频通话的例子介绍WebRTC中常用的API. 如果你下载并编译完成之后,会看到一个iOS 版的WebRTC Demo. ...

  4. Windows Server2008R2、2012R2重置系统开机登陆密码

    平时用的虚拟机太多导致经常会忘记密码,这里分享两个链接,分别对应的是08R2和12R2重置密码的方法. 08R2:http://ucweb.blog.51cto.com/4042188/962284 ...

  5. ORACLE ORA-01653: unable to extend table 的错误

    ORACLE ORA-01653: unable to extend table 的错误 今天用PL SQL Developer往oracle数据库中导入数据时,突然报错,只能终止,错误的具体内容如下 ...

  6. [译]百里挑一:21个优质Swift开源App

    Mybridge AI根据代码质量和start排名从900多个开源项目中选出21个开源项目. 1:Firefox iOS [Official] Firefox iOS app built in Swi ...

  7. C#调用GDAL算法进度信息传递

    GDAL库中提供了很多的算法,同时也提供了进度条的参数.对于C++调用来说,应该没什么问题,但是对C#调用来说,在进度条这块需要写一个代理来进行传递.首先写一个简单的测试代码. 首先定义一个委托函数原 ...

  8. Gitflow工作流程

    在工作场合实施Git的时候,有很多种工作流程可供选择,此时反而会让你手足无措.本文罗列了企业团队最常用的一些Git工作流程,包括Centralized Workflow.Feature Branch ...

  9. 小强的HTML5移动开发之路(9)——坦克大战游戏3

    来自:http://blog.csdn.net/dawanganban/article/details/17754235 上一篇我们创建了敌人的坦克和自己的坦克,接下来就应该让坦克发子弹了,我们下面来 ...

  10. Java实现简易的文本编辑器

    需求分析: 获得文本名称 实现尾部追加功能 实现覆盖式添加数据 删除数据 获取光标位置 在特定光标位置处添加数据 查找特定字符串在主串中第一次出现的位置 统计文本文件内出现的数字,汉字,英文字母,特殊 ...