跨域 ajax 和 php 会话
Posted
技术标签:
【中文标题】跨域 ajax 和 php 会话【英文标题】:Cross Domain ajax and php sessions 【发布时间】:2011-01-07 13:04:27 【问题描述】:我对此感到困惑...我正在做一个远程小部件类型的设置,我们将控制两个域,因此安全性不是问题。我正在使用 jsonp 来允许跨域 ajax 请求。
访问的站点是domain1.com,其中包括:
<script src="domain2.com/file.js"></script>
file.js 使用 jQuery 发出 ajax 请求:
$.ajax(
url: 'http://domain2.com/getdata',
dataType: 'jsonp',
success: function(response)
div.html( response );
);
它以某种向导的形式完成其中的几个步骤,从远程服务器重新加载带有 html 的 div。
我遇到的问题是,在每个 ajax 请求中,我都会获得一个新的 php 会话 ID,并且我的会话数据会消失。 PHP 的结果很好,如果我从同一个域运行相同的脚本(仍然使用 jsonp),一切正常。但是,从远程域执行此操作,并且会话不会持续存在。我不知道这是为什么,php 端正在设置并从它自己的域中请求一个 cookie。我不需要从 JS 访问 cookie。 cookie 正在写入并保存在服务器上。但是当我检查浏览器中存储的 cookie 时,每个请求的会话 id 都发生了变化。
有什么想法吗?
【问题讨论】:
你试过其他浏览器吗? 【参考方案1】:将 ajax jsonp 请求指向同一域中的 php 文件,然后在该 php 文件中,trought cUrl,向第二个域发出请求。
简而言之,使用一个php文件作为两个域之间的隧道(cUrl只是一个例子)
【讨论】:
然后使用服务器带宽,而不是客户端 他没有提到带宽问题;)这是在将输出打印到浏览器之前对输出进行某种控制的唯一方法【参考方案2】:我创建了一个非常简单的测试用例,它工作得很好。
实际的应用程序正在使用 cakephp 及其会话。我尝试改用 $_SESSION 来代替,但没有用。我尝试将 session_start() 添加到控制器,但没有奏效。最后我在配置中禁用了 cakephp 会话,现在它工作得很好。
我不知道为什么它不起作用,但似乎是 cakephp 的一个小故障。
【讨论】:
终于找到了解决办法。在蛋糕中,我必须将 Session.security 设置为中等。在高安全性下,每个请求都会生成一个新的会话 ID,以防止会话劫持。由于我无法理解的原因,跨域 ajax 请求似乎没有获取新的 cookie 会话 id,而普通 ajax 可以......【参考方案3】:对不起,我没有读到您正在使用 jsonp。所以这不是解决方案...
使用 javascript,您无法对与您的网站运行所在的域不同的域进行 AJAX 调用。 这称为同源策略,可在您的站点出现 XSS 问题时提供更高的安全性。 有关更多信息,请参阅***文章:http://en.wikipedia.org/wiki/Same_origin_policy 通过在您的服务器上提供一个路由 php 脚本,您可以通过您的服务器将这些 Javascript AJAX 调用路由到目标域/服务/任何东西。
【讨论】:
以上是关于跨域 ajax 和 php 会话的主要内容,如果未能解决你的问题,请参考以下文章