请求处理 - Cookie ¶
作者:KK
发表日期:2016.12.12
先use yii\web\Cookie;
,然后测试代码:
获取请求过来的cookie ¶
$cookie = Yii::$app->request->cookies->get($name, '默认值'); //获取cookie对象再输出值
echo $cookie->value;
//快捷点的方法,直接取值,不取对象
echo Yii::$app->request->cookies->getValue($name, '默认值');
这其实和Yii::$app->request->get
一样,只是从cookies里面get而已
还可以把cookies当数组来用:
echo Yii::$app->request->cookies[$name]->value;
echo Yii::$app->request->cookies[$name]->path;
以数组形式返回所有cookie:
echo Yii::$app->request->cookies->toArray();
添加 ¶
$cookie = new Cookie([
'name' => 'token',
'value' => md5(121212),
//以下非必须
'domain' => 'xxx.com',
'expire' => time() + 86400,
'path' => '/sale',
]);
Yii::$app->response->cookies->add($cookie); //注意是 response 组件
Yii::$app->request->cookies->add($cookie); //报错,因为request组件的cookies是只读的
如果已存在,则add会覆盖掉原有的cookie
删除cookie ¶
Yii::$app->response->cookies->remove($name);
当然,企图从request->cookie里删除也会因为只读而报错的,反正request是请求发过来的,在这种面向对象的体系中,你不能篡改人家写给你的书信内容然后说人家没写过给你
判断是否存在 ¶
if(Yii::$app->response->cookies->has($name)){
echo '存在';
}
安全问题 ¶
cookie的值是123,发给客户端了,下次它再请求发回来的时候恶意改成了223,校验就变得不可靠了
所以就要对发出去的Cookie做参数签名啦,在Yii里签名密钥就是request组件的cookieValidationKey这个属性
也就是刚开始安装Yii时下载应用模板后就要配置的那个cookieValidationKey
如果不需要对Cookie做签名则设置request组件的enableCookieValidation
属性为false
进行关闭
题外话:如果开启加密,前端JS读到的值是加密后的值咋办 ¶
其实通常要加密的话,这些cookie的存在目的根本就不是给前端代码调用的,而是让客户端下次请求时再次回传给后端校验
前端完全不需要读取这些值做什么处理判断
而前端如果有需要这样的话,那这个值完全可以由前端自己在适当的时机去设置,JS代码也能设置cookie啊,这样前端就能实现自己的功能判断了,为什么非要把这些功能耦合到后端去呢?
相关文章:《程序设计心得分享 - 能不让服务端干的事就别让服务端去干》