codecamp

COOKIE:对COOKIE原生态的支持及记忆加密升级版

只要你能把握自己,你就能把握任何东西。 -- 古谚语

1.28.1 原生态的支持

应开发同学的需求,这里补充对COOKIE的支持。

因为,确实在项目的开发过程中,有时是需要对COOKIE进行处理的。所以,这里提供了简单的原生态支持。

下面通过代码示例来简明如何使用。

(1)注册COOKIE服务

如同其他的服务一样,我们在使用前需要对COOKIE进行注册。不需要用到COOKIE的同学,可以忽略此服务的注册。

在初始化文件init.php中添加如下注册代码:

//COOKIE
DI()->cookie = 'PhalApi_Cookie';

(2)使用

查看PhalApi_Cookie提供的接口,可以得到针对COOKIE的三种操作:

//设置COOKIE服务
DI()->cookie->set('name', 'phalapi', $_SERVER['REQUEST_TIME'] + 600);

//获取
echo DI()->cookie->get('name');  //输出 phalapi

//删除
DI()->cookie->delete('name');

1.28.2 记忆加密升级版

实际情况,项目的使用的情况更为复杂。

比如,需要对数据进行加解密,或者需要突破COOKIE的限制(设置后需要下一次请求才能获取,不过这也正是COOKIE的特点),想记住这一次设置的内容。所以,额外提供了这个升级版本。

(1)注册COOKIE服务

和原生态的初始化,有些许不同,在于需要配置指定加解密的服务。如下:

$config = array('crypt' => $crypt, 'key' => 'a secrect');
DI()->cookie = new PhalApi_Cookie($config);

上面中的crypt即为加密解服务,未指定时使用DI()->crypt,需要实现PhalApi_Crypt接口;key则为对应的密钥。

(2)使用COOKIE服务

使用同原生态一样,客户端感知不到区别,这里不再赘述。

(3)一个简单的实现示例

假设我们有这样一个简单的加解密类(真的很简单的):

class Cookie_Crypt_Mock implements PhalApi_Crypt {

    public function encrypt($data, $key) {
        return base64_encode($data);
    }

    public function decrypt($data, $key) {
        return base64_decode($data);
    }
}

随后,写一个简单的接口测试一下(因为涉及到COOKIE的操作,需要与浏览器可视化测试,所以没用单元测试):

    public function cookieTest() {
        $rs = array();

        $config = array('crypt' => new Cookie_Crypt_Mock(), 'key' => 'a secrect');
        DI()->cookie = new PhalApi_Cookie_Multi($config);

        $rs['aEKey'] = DI()->cookie->get('name');
        DI()->cookie->set('name', 'phalapi', $_SERVER['REQUEST_TIME'] + 600);

        return $rs;

    }

运行效果如下:

apic

从上图中可以看出,COOKIE在浏览器已经被我们做了“加密”,哈哈~

1.28.3 一如其他框架的建议

  • 1、敏感数据不要存到COOKIE,以保证数据安全
  • 2、大的数据不要存到COOKIE,以保证瘦的客户端

1.28.4 扩展你的COOKIE

如需扩展,请重载PhalApi_Cookie基类。

精益开发:更富表现力的Model层和重量级数据获取的应对方案
开放与封闭:多入口和统一初始化
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

八、视频教程

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }