我的所有CakePHP页面上的请求标头中都发送了一个cookie。见到这里:
我的问题是如何从Javascript中获取该值? document.cookie
返回''
示例请求标头(这是第一个,发送以获取页面):
GET /pages/view_media HTTP/1.1
Host: 192.168.1.11
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,fr-CA;q=0.6,fr;q=0.4
Cookie: CAKEPHP=n0r405fi68i395qhaa4luse8v6
编辑:CakePHP版本为2.4.1
或者,如果有办法从标题中获取CAKEPHP=n0r405fi68i395qhaa4luse8v6
值也可以。我只需要价值。
答案 0 :(得分:3)
Cookie正在与HTTP-Only flag一起发送,因此无法访问JavaScript。
看起来你所展示的是会话cookie,所以你必须适当地更改会话配置,特别是session.cookie_httponly
选项:
Configure::write('Session', array(
'defaults' => 'php',
'ini' => array(
// ...
'session.cookie_httponly' => false
)
));
对于常规Cookie,您可以使用Cookie组件httpOnly
选项:
public $components = array(
// ...
'Cookie' => array(
// ...
'httpOnly' => false
)
);
或财产:
public function beforeFilter() {
parent::beforeFilter();
// ...
$this->Cookie->httpOnly = false;
}
禁用HTTP-Only标志应使其正常工作,但请确保您了解安全隐患!非HTTP-Only cookie很容易通过XSS被盗,因此最好在您的控制器中读取cookie并将这些值仅传递给您真正需要的视图。
答案 1 :(得分:0)
readCookie('CAKEPHP');
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i < ca.length;i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1,c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
}
return null;
}
答案 2 :(得分:0)
另一个不涉及额外安全问题的解决方案是:
使用Cookie组件读取控制器中的cookie,将结果分配给变量并进行设置,以便您可以从视图中访问该变量。
$myVar = $this->Cookie->read('User.name');
$this->set(compact('myVar'));
然后,在您的视图中,您将可以访问$ myVar。
您甚至可以使用JsHelper::set将变量传递给JavaScript。