跨域 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 会话的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 跨域 PHP 代理 403 错误

PHP、jQuery Ajax 和 json 跨域返回

使用 jQuery 和 AJAX 的跨域 PHP 调用

Ajax调用PHP服务跨域[重复]

PHP解决mui中ajax的跨域问题

php PHP跨域AJAX