使用Kohana和JavaScript的Cross Origin请求

时间:2013-08-21 11:30:14

标签: javascript cross-domain kohana-3.3

我正在尝试实现一些代码,这些代码允许我让一个子域与另一个子域通信,例如one.example.comtwo.example.com。由于我已将Cookie设置为使用.example.com,因此这两个网站可以共享Cookie和会话数据。

当我通过标准HTTP访问任一站点时,我可以转储会话并查看预期的数据。但是,如果我通过JavaScript使用jQuery $.ajax()执行此操作,则转储的会话数据为空。在这两种情况下,我都使用PHP来转储会话数据。

我尝试了以下解决方案,但还没有运气(http://forum.kohanaframework.org/discussion/9895/problem-session-expired-with-ajax/p1)。我也使用稍微更新版的Kohana(3.3)。

我也尝试在到达控制器后立即设置标头:

$this->response->headers('Access-Control-Allow-Origin', 'http://one.example.com');
$this->response->headers('Access-Control-Allow-Credentials', 'true');
$this->response->headers('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');

但Chrome检查员仍然会将Access-Control-Allow-Origin显示为*

1 个答案:

答案 0 :(得分:2)

问题

我遇到的问题是由于我的Apache配置文件中的设置如下所示:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

为了解决我的特定问题,我简单地删除/注释掉了上面的代码,因为它覆盖了我从PHP发送的标题。

我实施的解决方案非常简单。在下面的示例中,我们假设我正在从one.example.com(主网站)拨打电话到two.example.com(子站点)。

Kohana / PHP

在我的PHP中,我设置了以下标题,我选择在我的父控制器中执行此操作。如果您愿意,可以创建自己的Cors类或帮助程序。基本上,您不希望在整个项目中将此代码重复数百次。

$this->response->headers('Access-Control-Allow-Origin', 'http://one.example.com');
$this->response->headers('Access-Control-Allow-Credentials', 'true');
$this->response->headers('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');

JavaScript / jQuery

在我的$.ajax()请求中,我必须确保将xhrFields.withCredentials属性设置为true

$.ajax({
    url: 'two.example.com',
    xhrFields: {
        withCredentials: true
    }
});

或者我可以为所有ajax请求全局设置它,如:

$(document).ajaxSend(function (event, xhr, settings) {
    settings.xhrFields = {
        withCredentials: true
    };
});

有关详细信息,请查看$.ajax文档:http://api.jquery.com/jQuery.ajax/

进一步阅读

有关详细信息,请查看以下资源: