请求处理 - 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啊,这样前端就能实现自己的功能判断了,为什么非要把这些功能耦合到后端去呢?

相关文章:《程序设计心得分享 - 能不让服务端干的事就别让服务端去干