我在使用CakePHP会话和AJAX时遇到了很多麻烦。我有一个使用Auth->login()
的AJAX登录,然后我使用Session->write()
添加一些额外的参数。
$this->Auth->login();
$this->Session->write('Auth.User.id', $user_grab['User']['id']);
$this->Session->write('Auth.User.auth_level', $user_grab['User']['auth_level']);
$this->Session->write('Auth.User.successful', 3);
我上午根据我已阅读的一些建议使用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中使用Session和Auth。
预期的行为能够在AJAX中使用Session-> write()并让我写的内容可以在其他地方使用。为了测试,我使用了一个简单的调试($ _ SESSION)和调试($ this-> Session-> read())的测试操作。
答案 0 :(得分:0)
这是愚蠢的事。我想在这里记录其他人的参考:
它与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>