为了配合 CDN 前台。 后台的域名改成了 mt.easun.org/cgi-bin。 之所以启用子域而不是独立域名,是因为同域不同子域间可以天然共享 cookie ,而MT的POST必须带有 cookie ,不然登录信息验证不过。
测试一下正常的POST,没有任何问题。cookie 由于 CookieDomain 为 .easun.org
,所以cookie信息正常传递给了 mt.easun.org
后台。
但是接下来用 JQ $.post
进行 AJAX POST 的时候,就出现跨域问题了。 如果是Get
,很简单,可以参考我上篇( [JQ+Perl]JQ AJAX跨域请求HTML/JS页面内容总结 )解决之。 POST
就必须设置跨域请求了。
不想回归 iframe
。幸好服务器部分配置可以自己控制。在后台脚本目录建立 .htaccess
,内容如下:
code<IfModule mod_headers.c>
Header set Access-Control-Allow-Credentials: true
Header set Access-Control-Allow-Origin "http://easun.org"
</IfModule>
这下应该可以 $.post
了吧?
但是结果依然很悲哀,这次 POST 成功, 但是 JQ 并不传递 Cookie。导致身份认证出错。
Google之。发现跨域(包括子域), 如果要传递Cookie, JQ AJAX 还需要手动发送认证凭证,设置 withCredentials
,这样才会传递 Cookie.
根据这些信息。 重写 $.post
为 $.ajax
模式,代码如下:
code$.ajax({
type: 'POST',
cache:false,
url: url,
data: $("#comments-form").serialize(),
success: function(data){
if (f.preview.value =='1' ) { EasunisPreReturn(data);}
else {EasunisPostReturn(JSON.parse(data));}
},
xhrFields: { withCredentials: true },
});
return false;
调试之,一切OK。
参考资料:
1.【前端笔记】使用ajax跨域withCredentials的作用
后记:
对于IE8,9 来说。JQ AJAX 跨子域Post 即使设置了上述也会失败。原因很奇葩,跨域提交需要使用 XDomainRequest
对象。
幸好有 JQ 插件 jQuery-ajaxTransport-XDomainRequest 可以解决。 在 $.ajax 前引入:
code<!--[if lte IE 9]>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js"></script>
<![endif]-->
同时,为了兼容出错信息,当$.ajax 失败的时候,设定正常方式POST。虽然这样界面乱了,但是保证功能正常。
codeerror: function(){ f.submit(); }
Ojz。我到现在还在用子文件夹来存放登陆文件。。
其实就是子文件夹。只是多个子域名指向罢了。
对于IE8,9 来说。JQ AJAX 跨子域Post 即使设置了上述也会失败。原因很奇葩,跨域提交需要使用XDomainRequest 对象。
幸好有 JQ 插件 [jQuery-ajaxTransport-XDomainRequest](https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest) 可以解决。 在 $.ajax 前引入:
同时,为了兼容出错信息,当$.ajax 失败的时候,设定正常方式POST。虽然这样界面乱了,但是保证功能正常。
谢谢博主,学习了。我有个问题想问一下,就是用ajax跨域,我需要带一个凭证,那这样的话跟dataType还有关系么,因为get的datatype是jsonp
与 dataType 没有太大的关系,但是应该让 datatype 和函数符合是编程的优秀习惯哦。如果 dataType 不正确也许会让数据处理出问题,但是服务器验证不会关心dataType ,实际上,它总是返回的纯文本。