首页   网站推广   网站优化   网站赚钱   网站运营  门户动态 建站经验 网络安全 DIV+CSS教程 网页设计 站长论坛 站长IDC
 ASP教程  PHP教程   JSP教程  .NET教程   XML教程  SQL教程 鼠标特效 窗口特效 图像特效 按钮特效 站长工具 源码下载
zanox Affiliates find Affiliates
文字广告位招商|文字广告位招商 | 华北站长站 | 文字广告位招商 | 华北站长站 | 文字广告位招商 | 华北站长站 | 文字广告位招商 | 华北站长站| 华北站长站
   北京奥运会倒计时:
当前时间
  当前位置 → 华北站长站JS教程 → 浏览正文
服务器端可控情形JS跨域访问解决方法
发布时间::2008年04月22日 【字体: 】&  作者:网络 [ 加入收藏]

我在最近的一个 web 项目中为了实现 bookmark 功能碰到了 javas cript 跨域访问的问题。起初,在 google 上搜的很多解决方案并不适用于我的情形,只在有一篇文章中提到的远程加载 javas cript 方法从理论上看到了解决的希望。但可惜作者只是一笔带过,并未用例子详细说明,所以不得不摸索了一阵才把这个问题搞定。在此,希望通过本文为同样被这个问题困扰的朋友们提供一个解决方法作为参考。如有错误,欢迎指正!

  Bookmark 是目前许多 web2.0 网站 (http://del.icio.us/, www.diigo.com 等)都提供的热门 feature 。它能将互联网上自己喜欢的网页收藏到 Bookmark 服务器上。本文要解决的问题就发生在用户提交网页 URL (还包括 Tag, Notes 等)给 Bookmark 服务器时。

  关于 URL 的提交至少可以有三种方式:

  1. 登陆 Bookmark 服务器的提交页面,将要收藏的 URL 通过该页面提交给服务器。

  2. 安装浏览器插件,通过插件将 URL 提交给服务器。

  3. 从 Bookmark 服务器动态加载 javas cript 小工具到当前页面,通过它来完成提交工作。(参考 diigo 的例子,收藏一个网页链接到浏览器收藏夹,链接的 URL 是一段 javas cript 代码,它会从服务器加载一段 javas cript 注入当前网页)

  第一种方式开发起来最简单,但对用户来讲比较麻烦,每次都需要先登陆 Bookmark 服务器才能完成提交;第二种方式我并不熟悉插件开发,而且用户也不喜欢太多的插件堆满自己的浏览器;第三种方式开发难度小,又避免了每次登陆服务器的麻烦,所以我最终采用了它。

  上面讲的第三种方式中动态加载的 javas cript 小工具除了需要生成 UI 供用户填写信息( URL , tag , notes 等),当用户点击提交的时候,还要完成与服务器通信的功能。在没有跨域访问经验的情况下,最先想到的当然是 ajax !但很快就会发现根本行不通。

  跨域访问,简单来说就是 A 网站的 javas cript 代码试图访问 B 网站,包括提交内容和获取内容。由于安全原因,跨域访问是被各大浏览器所默认禁止的。写过跨域访问 ajax 的朋友相信都遇到过被告知“没有权限”的情况。通过 XMLHttp 来发送数据给 Bookmark 服务器的尝试失败了。于是,看到网上的一些资料,我又开始尝试用 javas cript 小工具在用户网页动态创建一个隐藏的 iframe, iframe 的 src 指向服务器的一个 servlet ,试图通过调用 iframe 中提供的 javas cript 来完成与服务器的通信。但不幸的是,用户网页中的 javas cript 代码访问 iframe 也被浏览器归为跨域访问(特指 iframe 的 src 指向其它网站的情形),尝试再次失败。

  最终,在一篇文章中看到,与 iframe 不同,如果 A 网站从 B 网站加载 javas cript , A 网站可以自由的访问该 javas cript 的内容,并不会被浏览器认为是跨域访问。模仿刚才 iframe 的思路,当用户点击提交时,可以动态创建一个 javas cript 对象,该对象的 src 指向 Bookmark 服务器的一个 servlet ,注意: URL 、 Tag 、 Notes 、 User 、 Password 等信息被作为 src URL 参数传给服务器。请看下面的代码:

以下是引用片段:
  var url = "http://localhost:8080/Deeryard/BookmarkServlet?" +
  "url=" + url_source + "&" + "title=" + title + "&" +
  "tag=" + tag + "&" + "notes=" + notes + "&" + "user=" + user + "&" + "password=" + password;
  url = encodeURI(url);
  //Submit to server with a trick
  var js_obj = document.createElement( "s cript" );
  js_obj.type = "text/javas cript" ;
  js_obj.setAttribute( "src" , url);
  //Get response from server by appending it to document
  document.body.appendChild(js_obj);

  上面例子中, js_obj.setArrribute() 将信息作为 src 的 URL 参数提交给了 Bookmark servlet 。那么用户又如何取得服务器的响应信息呢?答案就是最末一行代码, servlet 的输出必须是 javas cript 代码,它可以调用用户网页上的其他 javas cript 函数,以及操作 dom 对象。下面的 servlet 代码生成了一个 javas cript 函数调用:

  out.write("onServerResponse(INADEQUATE_INFORMATION);");

  document.body.appendChild(js_obj) 执行后 onServerResponse( INADEQUATE_INFORMATION) 就会得到执行,使客户网页响应服务器结果。这样一个完整的通信过程就完成了。

  来总结一下这个案例,首先与很多跨域访问的情形不同,本文提到的跨域访问需要对服务器端进行控制,即让服务器端 Servlet 来适应客户端网页 javas cript 的需求;而其他一些常见的例子则对服务器端没有控制能力,比如从其他网站抓内容的小偷程序。另外,需要注意的是这种方法中实际用到了 get 方法来提交信息,从一些资料上看到, get 方法每次提交的信息不能超过。

  上一篇:在Javascript中,什么是闭包(Closure)
  下一篇:脚本控制三行三列自适应高度DIV布局

郑重声明:本文仅代表作者个人观点与本站无关,其原创性与文中所述文字和内容未经本站证实,对本文及其中全部或部分内容、文字的真实性、完整性、及时性本站不作任何保证和承诺,请自行核实相关内容。
620*136广告位出租,联系QQ:513178175 793518
 相关文章
·[JS教程] 脚本控制三行三列自适应高度DIV布局04-22 
·[JS教程] 在Javascript中,什么是闭包(Closur04-22 
·[JS教程] innerHTML在Firefox和Opera下的04-22 
·[JS教程] javascript实现划词标记划词搜索功能04-22 
·[JS教程] 网页Javascript提交OutLook发送邮件04-22 
  热门文章
百度在今年推出广告营销产品06-09 
google终于制造出其第一台06-09 
windows系统下安装MyS06-08 
中国网站发展的重中之重是创新盈06-08 
使用不着dreamweaver06-08 
杨致远向雅虎员工致信来解读代理06-08 
 我国外交部驳中国特工盗取美部06-08 
微软新购公司涉嫌会计丑闻遭调查06-03 
揭开国际铁公鸡排行榜背后真相05-30 
  推荐文章
[门户动态] 微软新购公司涉嫌会计丑闻遭调
[门户动态] 揭开国际铁公鸡排行榜背后真相
[门户动态] 亚马逊将试水网络视频服务
[门户动态] 马云承诺5000万美元建华南
[建站经验] 国内网络广告市场竞争分析
[建站经验] 搜索引擎向网上社区发力 成为
[网站运营] 网站运营之在线客户界面设计
[门户动态] 中华英才网张建国:规划人生三
[门户动态] 报告称2013年全球网络视频
关于我们 | 用户帮助 | 隐私权政策 | 版权声明 | 意见反馈 | 友情链接 | 广告服务 | 免责条款 |
华北站长站 版权所有 2003-2008
鲁ICP备08006134号 广告合作QQ:793518  广告招商电话:0531-88819137
浏览本站建议选用IE5.0以上浏览器 1024*768分辨率
本站由中华e联提供空间支持
本站基于ACTCMS1.0所建