<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[转]ajax 设置Access-Control-Allow-Origin实现跨域访问]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Fri, 04 Dec 2015 05:24:18 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：现在H5做上传呢，想有好的用户体验是直接提交ajax上传文件，其实用form跳转也是可以的，不是说用户体验不好嘛，其实我觉得也没啥不好的，只要提示明确就好，非要在一个页面上做所有的操作，这是产品挖空心思想的问题，为什么不能呢，这儿有一个兄弟告诉我们说能的。其主要是设置http的header头符合一些h5的跨域规范就成（像Flash有一个xml文件作验证的，Flash不行了，咱还是H5吧。），这块啥语言都能设置头，包括nginx的conf文件里也能设置（http://www.anrip.com/post/1501 ，http://blog.csdn.net/oyzl68/article/details/18741057（讲到两次请求，这更像是flash的那套作法了，这块服务端配置上可能会不大一样。），html5rocks.com 上面的头返回可参考。），先转下，尽管没有通知作者。<br/><br/>选择了http头来实现跨越的原理概述：<br/>ajax跨域访问是一个老问题了，解决方法很多，比较常用的是JSONP方法，JSONP方法是一种非官方方法，而且这种方法只支持GET方式，不如POST方式安全。<br/>即使使用jquery的jsonp方法，type设为POST，也会自动变为GET。<br/>官方问题说明：<br/>“script”: Evaluates the response as JavaScript and returns it as plain text. Disables caching by appending a query string parameter, “_=[TIMESTAMP]“, to the URL unless the cache option is set to true.Note: This will turn POSTs into GETs for remote-domain requests.<br/>如果跨域使用POST方式，可以使用创建一个隐藏的iframe来实现，与ajax上传图片原理一样，但这样会比较麻烦。<br/><br/>——————————————————————————————————————————————————————————————<br/>ajax跨域访问是一个老问题了，解决方法很多，比较常用的是JSONP方法，JSONP方法是一种非官方方法，而且这种方法只支持GET方式，不如POST方式安全。<br/><br/>即使使用jquery的jsonp方法，type设为POST，也会自动变为GET。<br/><br/>官方问题说明：<br/>“script”: Evaluates the response as JavaScript and returns it as plain text. Disables caching by appending a query string parameter, “_=[TIMESTAMP]“, to the URL unless the cache option is set to true.Note: This will turn POSTs into GETs for remote-domain requests.<br/><br/>如果跨域使用POST方式，可以使用创建一个隐藏的iframe来实现，与ajax上传图片原理一样，但这样会比较麻烦。<br/><br/>因此，通过设置Access-Control-Allow-Origin来实现跨域访问比较简单。<br/><br/>例如：客户端的域名是www.client.com,而请求的域名是www.server.com<br/>如果直接使用ajax访问，会有以下错误<br/>XMLHttpRequest cannot load http://www.server.com/server.php. No &#039;Access-Control-Allow-Origin&#039; header is present on the requested resource.Origin &#039;http://www.client.com&#039; is therefore not allowed access.<br/><br/>在被请求的Response header中加入<br/><textarea name="code" class="php" rows="15" cols="100">
// 指定允许其他域名访问&nbsp;&nbsp;
header(&#039;Access-Control-Allow-Origin:*&#039;);&nbsp;&nbsp;
// 响应类型&nbsp;&nbsp;
header(&#039;Access-Control-Allow-Methods:POST&#039;);&nbsp;&nbsp;
// 响应头设置&nbsp;&nbsp;
header(&#039;Access-Control-Allow-Headers:x-requested-with,content-type&#039;);&nbsp;&nbsp;
</textarea><br/>就可以实现ajax POST跨域访问了。<br/><br/>代码如下：<br/>client.html 路径：http://www.client.com/client.html<br/><textarea name="code" class="html" rows="15" cols="100">
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot;&gt;&nbsp;&nbsp;
&lt;html&gt;&nbsp;&nbsp;
 &lt;head&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html;charset=utf-8&quot;&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;title&gt; 跨域测试 &lt;/title&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&lt;script src=&quot;//code.jquery.com/jquery-1.11.3.min.js&quot;&gt;&lt;/script&gt;&nbsp;&nbsp;
 &lt;/head&gt;&nbsp;&nbsp;
&nbsp;&nbsp;
 &lt;body&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&quot;show&quot;&gt;&lt;/div&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;script type=&quot;text/javascript&quot;&gt;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;$.post(&quot;http://www.server.com/server.php&quot;,&#123;name:&quot;fdipzone&quot;,gender:&quot;male&quot;&#125;)&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.done(function(data)&#123;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(&quot;show&quot;).innerHTML = data.name + &#039; &#039; + data.gender;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;&nbsp;&nbsp;
 &lt;/body&gt;&nbsp;&nbsp;
&lt;/html&gt;&nbsp;&nbsp;
</textarea><br/>server.php 路径：http://www.server.com/server.php<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php&nbsp;&nbsp;
$ret = array(&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#039;name&#039; =&gt; isset($_POST[&#039;name&#039;])? $_POST[&#039;name&#039;] : &#039;&#039;,&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#039;gender&#039; =&gt; isset($_POST[&#039;gender&#039;])? $_POST[&#039;gender&#039;] : &#039;&#039;&nbsp;&nbsp;
);&nbsp;&nbsp;
&nbsp;&nbsp;
header(&#039;content-type:application:json;charset=utf8&#039;);&nbsp;&nbsp;
header(&#039;Access-Control-Allow-Origin:*&#039;);&nbsp;&nbsp;
header(&#039;Access-Control-Allow-Methods:POST&#039;);&nbsp;&nbsp;
header(&#039;Access-Control-Allow-Headers:x-requested-with,content-type&#039;);&nbsp;&nbsp;
&nbsp;&nbsp;
echo json_encode($ret);&nbsp;&nbsp;
?&gt;&nbsp;&nbsp;
</textarea><br/>Access-Control-Allow-Origin:* 表示允许任何域名跨域访问<br/>如果需要指定某域名才允许跨域访问，只需把Access-Control-Allow-Origin:*改为Access-Control-Allow-Origin:允许的域名<br/>例如：header(&#039;Access-Control-Allow-Origin:http://www.client.com&#039;);<br/><br/>如果需要设置多个域名允许访问，这里需要用php处理一下<br/>例如允许 www.client.com 与 www.client2.com 可以跨域访问<br/>server.php 修改为<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php&nbsp;&nbsp;
$ret = array(&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#039;name&#039; =&gt; isset($_POST[&#039;name&#039;])? $_POST[&#039;name&#039;] : &#039;&#039;,&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#039;gender&#039; =&gt; isset($_POST[&#039;gender&#039;])? $_POST[&#039;gender&#039;] : &#039;&#039;&nbsp;&nbsp;
);&nbsp;&nbsp;
&nbsp;&nbsp;
header(&#039;content-type:application:json;charset=utf8&#039;);&nbsp;&nbsp;
&nbsp;&nbsp;
$origin = isset($_SERVER[&#039;HTTP_ORIGIN&#039;])? $_SERVER[&#039;HTTP_ORIGIN&#039;] : &#039;&#039;;&nbsp;&nbsp;
&nbsp;&nbsp;
$allow_origin = array(&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#039;http://www.client.com&#039;,&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#039;http://www.client2.com&#039;&nbsp;&nbsp;
);&nbsp;&nbsp;
&nbsp;&nbsp;
if(in_array($origin, $allow_origin))&#123;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;header(&#039;Access-Control-Allow-Origin:&#039;.$origin);&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;header(&#039;Access-Control-Allow-Methods:POST&#039;);&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;header(&#039;Access-Control-Allow-Headers:x-requested-with,content-type&#039;);&nbsp;&nbsp;
&#125;&nbsp;&nbsp;
&nbsp;&nbsp;
echo json_encode($ret);&nbsp;&nbsp;
?&gt;&nbsp;&nbsp;
</textarea><br/>源码下载地址：http://download.csdn.net/detail/fdipzone/8779657<br/>该文转自：http://blog.csdn.net/fdipzone/article/details/46390573
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [转]ajax 设置Access-Control-Allow-Origin实现跨域访问]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>