JSON进阶第三篇 apache多域名及JSON的跨域问题(JSONP)

本文先介绍如何为apache配置多域名,然后再用JSONP(JSON with Padding)来解决JSON的跨域问题。

阅读本文之前,推荐先参阅《JSON进阶第二篇AJAX方式传递JSON数据》。

一.apache配置多域名

在apache的conf目录下找到httpd.conf,然后在该文件最后增加如下内容:

# 声明使用虚拟主机过滤规则

NameVirtualHost*:80

#虚拟主机localhost

<VirtualHost*:80>

ServerName  localhost

DocumentRoot"D:\xampp\htdocs\www"

</VirtualHost>

#虚拟主机test.mw.com

<VirtualHost*:80>

ServerName  test.mw.com

DocumentRoot"D:\xampp\htdocs\test.mw.com"

</VirtualHost>

其中第一个是保证原有的localhost还可以继续工作,第二个为新加域名test.mw.com。

然后再修改host文件(在C:\Windows\System32\drivers\etc\)

增加:

#  test.mw.com

127.0.0.1test.mw.com

注意修改httpd.conf后要重启下apache服务。

将《JSON进阶第二篇 AJAX方式传递JSON数据》文中的json2.php拷贝到D:\xampp\htdocs\test.mw.com目录中再在浏览器中输入网址http://test.mw.com/json2.php

运行结果如下:

在浏览器中能看到如上所示的JSON字符串说明已经成功为apache增加了新的域名,接下来就来体验下JSON的跨域名问题。

将json2.html中“$.post("json2.php", {}, function(data){”的“json2.php”改成“http://test.mw.com/json2.php”表示我们要引用test.mw.com域名下的json2.php文件。然后在json2.html中点击按钮,可以发现没任何效果。

用Firefox的Firebug查看点击按钮后AJAX响应的详细过程,可以看到AJAX请求信息已经发送到服务器上了(就是那个127.0.0.1:80),但因为安全性问题,服务器返回的数据被屏蔽了——这就是大名鼎鼎的跨域问题

二.JSONP——解决JSON跨域问题

使用JSONP(JSON with Padding)就可以解决JSON的跨域问题,JSONP的原理可以访问http://zh.wikipedia.org/zh-cn/JSONP简单的说就是利用了<script>标签拥有的开放策略(相对于同域策略)。下面介绍如何使用JSONP。

JSONP的使用分为二步:

第一将html文件中的

$.post("http://test.mw.com/json2.php",{}, function(data){

改成

$.getJSON("http://test.mw.com/json2.php?format=json&jsoncallback=?",{}, function(data){

第二将json2.php最后的

echo$article_json;

改成

echo$_REQUEST[‘jsoncallback‘] . "(" . $article_json . ")";

修改这二个地方后就可以解决JSON的跨域问题了。

下面也给出完整的示例程序,分为json2.php和json2.html, json2.html上有个按钮,按下后将发送AJAX请求得到json2.php返回的跨域JSON数据。注意和上一篇《JSON进阶第二篇 AJAX方式传递JSON数据》文中的代码进行比较。

1.Json2.php

[php] view plaincopy

  1. <?php
  2. // by MoreWindows( http://blog.csdn.net/MoreWindows )
  3. $article_array = array(
  4. array(
  5. "id"=>"001",
  6. "title"=>"PHP访问MySql数据库 初级篇",
  7. "link"=>"http://blog.csdn.net/morewindows/article/details/7102362"
  8. ),
  9. array(
  10. "id"=>"001",
  11. "title"=>"PHP访问MySql数据库 中级篇 Smarty技术",
  12. "link"=>"http://blog.csdn.net/morewindows/article/details/7094642"
  13. ),
  14. array(
  15. "id"=>"001",
  16. "title"=>"PHP访问MySql数据库 高级篇 AJAX技术",
  17. "link"=>"http://blog.csdn.net/morewindows/article/details/7086524"
  18. ),
  19. );
  20. $article_json = json_encode($article_array);
  21. //echo $article_json;
  22. echo $_REQUEST[‘jsoncallback‘] . "(" . $article_json . ")";
  23. ?>

2.Json2.html    // by MoreWindows( http://blog.csdn.net/MoreWindows )

[html] view plaincopy

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <title>ajax方式请求跨域的json数据</title>
  5. <script type="text/javascript" src="../jquery-1.7.min.js"></script>
  6. <script type="text/javascript">
  7. //显示提示
  8. function OnMouseEnterDivInfo(thisObj, title)
  9. {
  10. $("#article_link").css("position","absolute");
  11. $("#article_link").css("left","20px");
  12. $("#article_link").css("top",$(thisObj).offset().top + $(thisObj).height());
  13. $("#article_link").html("链接地址" + title);
  14. $("#article_link").slideDown("fast");
  15. $(thisObj).css("background-color","red");
  16. }
  17. //隐藏提示
  18. function OnMouseLeaveDivInfo(thisObj)
  19. {
  20. $("#article_link").hide();
  21. $(thisObj).css("background-color","yellow");
  22. }
  23. //jquery通过AJAX方式得到JSON数据
  24. $(document).ready(function(){
  25. $("#GetDataBtn").click(function(){
  26. //$.post("http://test.mw.com/json2.php", {}, function(data){
  27. $.getJSON("http://test.mw.com/json2.php?format=json&jsoncallback=?", {}, function(data){
  28. var g_jsonstr = eval(data);
  29. var ilen = g_jsonstr.length;
  30. var detailhtml = "";
  31. for (var i = 0; i < ilen; i++)
  32. {
  33. var divhtml = ‘<div id=\"div_‘ + i + ‘\"  onmouseenter=\"OnMouseEnterDivInfo(this, \‘ ‘+ g_jsonstr[i][‘link‘] + ‘\‘);\" onmouseleave=\"OnMouseLeaveDivInfo(this);\" >‘;
  34. divhtml += ‘<h1>‘ + g_jsonstr[i][‘title‘] + ‘</h1>‘;
  35. divhtml += ‘</div>‘;
  36. detailhtml += divhtml;
  37. }
  38. $("#detail").html(detailhtml);//生成新的标题区域
  39. $("#detail").slideDown("slow");
  40. });
  41. });
  42. });
  43. </script>
  44. <style type="text/css">
  45. div
  46. {
  47. font-family:sans-serif;
  48. }
  49. </style>
  50. </head>
  51. <body>
  52. <input type="button" id="GetDataBtn" value="生成数据" />
  53. <div id="detail">
  54. </div>
  55. <p><span id="article_link" style="display:none;z-index:100"></span></p>
  56. </body>
  57. </html>

再用Firefox的Firebug查看点击按钮后AJAX响应的详细过程,可以发现已经可以收到跨域后的JSON数据了。

有兴趣的筒子可以再试试这种方式:

将http://test.mw.com/json2.php的

echo$_REQUEST[‘jsoncallback‘] . "(" . $article_json . ")";

换成

echo"ShowData($article_json)";

再将json2.html的

$(document).ready(function(){... }

换成

[javascript] view plaincopy

  1. function ShowData(data)
  2. {
  3. var g_jsonstr = eval(data);
  4. var ilen = g_jsonstr.length;
  5. var detailhtml = "";
  6. for (var i = 0; i < ilen; i++)
  7. {
  8. var divhtml = ‘<div id=\"div_‘ + i + ‘\"  onmouseenter=\"OnMouseEnterDivInfo(this, \‘ ‘+ g_jsonstr[i][‘link‘] + ‘\‘);\" onmouseleave=\"OnMouseLeaveDivInfo(this);\" >‘;
  9. divhtml += ‘<h1>‘ + g_jsonstr[i][‘title‘] + ‘</h1>‘;
  10. divhtml += ‘</div>‘;
  11. detailhtml += divhtml;
  12. }
  13. $("#detail").html(detailhtml);//生成新的标题区域
  14. $("#detail").slideDown("slow");
  15. }
  16. //jquery通过AJAX方式得到JSON数据
  17. $(document).ready(function(){
  18. $("#GetDataBtn").click(function(){
  19. //jsonp原理--利用<script>标签的开放策略
  20. var script = document.createElement(‘script‘);
  21. script.setAttribute(‘src‘, "http://test.mw.com/json2.php");
  22. document.getElementsByTagName(‘head‘)[0].appendChild(script);
  23. }

来试试,同样可以得到数据的(有一点不足——此时鼠标移动到标题是不会触发提示的)。

另外,关于JSON有个小小的问题要注意下:

[php] view plaincopy

  1. $array1 = array("a", "b");
  2. $array2 = array(‘001‘=>"a", ‘002‘=>"b");
  3. $json1 = json_encode($array1);
  4. $json2 = json_encode($array2);
  5. echo $json1 . "<br />";
  6. echo $json2 . "<br />";

会输出

["a","b"]

{"001":"a","002":"b"}

这说明,$json1是数组,而且$json2是对象。将$json1和$json2传到js代码中,$json1.length是合法的,但$json2.length是未定义的。读者可以对比本篇json2.php中数组$article_array与上一篇的区别。

JSON进阶第三篇 apache多域名及JSON的跨域问题(JSONP)

时间: 2024-10-14 00:55:05

JSON进阶第三篇 apache多域名及JSON的跨域问题(JSONP)的相关文章

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

加油~ --WH 一.什么是javascript跨域问题? 域:服务器域名,唯一标识(协议,域名,端口)必须保证一致,说明域相同 跨域:在一个服务器上,去访问另一个服务器上,并且得到另一个服务器返回回来的值,这就是javascript跨域,其实简单点,之前我们做的ajax,都是在同域中访问,现在只是访问的服务器变成了另外的,不是同一台了.仅此而已.但是这样一变,之前的代码就不能用了. 二.解决javascript跨域问题 解决该问题,有很多种方式,我百度了一下,好像这就属于前端的范畴了,所以我决

Ajax 跨域请求 jsonp获取json数据

遇到Ajax的跨域请求出问题 找了中解决办法如下: 参考内容:http://justcoding.iteye.com/blog/1366102 由于受到浏览器的限制,该方法不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.如果能控制数 据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误.但是,如果仅停留在自己的服务器上,Web 应用程序还有什么用处呢?如果需要从多个第三方服务器收集数据时,又该怎么办? 理解同源策略 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的

.Net Core 3.0 Api json web token 中间件签权验证和 CORS 中间件处理跨域请求

第一步:在Nuget上安装"Microsoft.AspNet.WebApi.Cors"包,并对api controller使用[EnableCors]特性以及Microsoft.AspNetCore.Authentication.JwtBearer包 第二步:创建.netcore API项目 /控制器:AuthenticateController using System; using System.Collections.Generic; using System.Linq; usi

手把手教你实现Java权限管理系统 后端篇(十二):解决跨域问题

什么是跨域? 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石. 如果一个请求地址里面的协议.域名和端口号都相同,就属于同源. 举个栗子 判断下面URL是否和 http://www.a.com/a/a.html 同源 http://www.a.com/b/b.html 同源 http://www.b.com/a/a.html 不同源,域名不相同 https://www.a.com/b/b.html 不同源,协议不相同 htt

chrome浏览器下用jQuery的load函数来跨域加载页面,响应状态status为(canceled)是什么情况? JSON和JSONP,也许你会豁然开朗,含jQuery用例

http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 问题来源:http://q.cnblogs.com/q/63123/ 问题出现的环境: 1:两个domain相同端口号不同的域名. 2:MVC4.0框架 3:从一个域名下用  jQuery.load("另一个域名下的页面"): 4:响应失败 : 响应状态status为(canceled) 请问这是什么情况呢 ?  我在IE下就没问题,可以

前端筑基篇(一)-&gt;ajax跨域原理以及解决方案

说明 跨域主要是由于浏览器的“同源策略”引起,分为多种类型,本文主要探讨Ajax请求跨域问题 前言 参考来源 什么是跨域 ajax跨域的表现 跨域的原理 如何解决跨域问题 JSONP方式解决跨域问题 CROS解决跨域问题 CROS请求原理 PHP后台配置 JAVA后台配置 .NET后台配置 FAQ multi value '*,*' 的问题 前言 强烈推荐阅读参考来源中的文章,能够快速帮助了解跨域的原理 参考来源 本文参考了以下来源 浏览器同源政策及其规避方法(阮一峰) 跨域资源共享 CORS

JSON跨域解决方案收集

最近面试问的挺多的一个问题,就是JavaScript的跨域问题.在这里,对跨域的一些方法做个总结.由于浏览器的同源策略,不同域名.不同端口.不同协议都会构成跨域:但在实际的业务中,很多场景需要进行跨域传递信息,这样就催生出多种跨域方法. 1. 具备src的标签 原理:所有具有 src 属性的HTML标签都是可以跨域的 在浏览器中, <script> . <img> . <iframe> 和 <link> 这几个标签是可以加载跨域(非同源)的资源的,并且加载的

jquery跨域请求json数据

//服务端生成json数据json.php <?php $json=array("Volvo","BMW","SAAB"); $cb = $_GET['callback']; echo $cb.'('.json_encode($json, true).')'; ?> //客户端Ajax请求数据<script> $(document).ready(function() { var url="http://域名/js

JSON跨域读取那点事(JSONP跨域访问)

最近在码一个小项目,需要远程读取json.因为需求很少,如果引用jquery使用其getjson方法就显得很浪费嘛= = 这篇文章很详细的解释了JSON跨域读取的前世今生,把原理讲得很透彻.特此分享. 原文链接:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 前言: 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强