CakePHP通过AJAX设置会话

CakePHP通过AJAX设置会话,php,ajax,session,cakephp,cakephp-2.0,Php,Ajax,Session,Cakephp,Cakephp 2.0,我在使用CakePHP会话和AJAX时遇到了很多问题。我有一个AJAX登录,我使用它来Auth->login(),然后在Session->write()的末尾添加一些额外的参数 Iam使用Configure::write('Session.checkAgent',false)根据我读过的一些建议 问题是,每当我在这个AJAX中进行设置时,它就不会出现在任何其他页面加载中:即使我在编写之后再次执行AJAX并只执行read(),read()也将是空的。就好像它完全忽略了AJAX。但如果我: ...

我在使用CakePHP会话和AJAX时遇到了很多问题。我有一个AJAX登录,我使用它来
Auth->login()
,然后在
Session->write()
的末尾添加一些额外的参数

Iam使用
Configure::write('Session.checkAgent',false)根据我读过的一些建议

问题是,每当我在这个AJAX中进行设置时,它就不会出现在任何其他页面加载中:即使我在编写之后再次执行AJAX并只执行read(),read()也将是空的。就好像它完全忽略了AJAX。但如果我:

 ...    

 $this->Session->write('Auth.User.successful', 3);

 print_r($this->Session->read());
我会看看这个环节应该做些什么,它不会真正节省。我可以在应用程序的非ajax部分的任何其他地方保存,甚至只是在站点索引上设置测试会话数据。它持续存在

我完全卡住了。它似乎与使用Auth->login()无关。我在AppController中同时使用会话和身份验证


预期行为:能够在AJAX中执行会话->编写(),并使我编写的内容在其他任何地方都可用。为了测试,我使用了一个带有简单调试($\u会话)和调试($this->SESSION->read())的测试操作。

这是一件愚蠢的事情。我想在这里记录以下内容供其他人参考:

它与
www
子域有关。在整个过程中,我碰巧在不同的地方漏掉了它,包括AJAX请求本身,这保证了新的会话只能通过www访问。这不是Cake独有的,但我认为这是一个重要的因素,对于任何经历过类似事情的人来说,都不容易在本地机器上复制

仅供参考,您可以通过.htaccess在整个域中强制使用www:

<IfModule mod_rewrite.c>
   RewriteEngine on

   RewriteCond %{HTTPS} off
   RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
   RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

   RewriteCond %{HTTPS} on
   RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
   RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

重新启动发动机
重写条件%{HTTPS}关闭
重写cond%{HTTP_HOST}^www\.(.*)$[NC]
重写规则^(.*)$http://www.%{HTTP_HOST}/$1[R=301,L]
在上重写cond%{HTTPS}
重写cond%{HTTP_HOST}^www\.(.*)$[NC]
重写规则^(.*)$https://www.%{HTTP_HOST}/$1[R=301,L]

$\u会话!=$这个->会话。CakePHP有自己的会话处理程序,因此您预期的行为案例在后面的部分永远不会起作用$此->会话->写入($key,$value)语法正确。你是说$this->Session->read()的结果是空的吗?这很奇怪,因为我的$u会话中充满了我期望从$this->Session->read()中得到的内容。我在AJAX之外编写的任何东西()都可以在$\u会话中访问。我在Cake配置中使用“php”会话类型。是的,$this->Session->read()是空的,但我可以在AJAX之外填充它,它会保持不变;在AJAX中,它根本不会保存。听起来很奇怪。确保在
AppController::$components
中,您在
Auth
之前提到了
Session
。如果您尝试以下操作会发生什么:
$this->Session->write('Test.successful',3)。它会持续吗?
<IfModule mod_rewrite.c>
   RewriteEngine on

   RewriteCond %{HTTPS} off
   RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
   RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

   RewriteCond %{HTTPS} on
   RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
   RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>