正文 【Laravel基础】16. Cookie和Session 拾年之璐 V管理员 /2021年 /586 阅读 0216 ## 16. Cookie和Session [TOC] ### 16.1 使用Cookie 1、首先,`获取Cookie` 有两种方法,具体如下: ```php //使用request()->cookie 获取解密后的cookie 信息 return request()->cookie('laravel_session'); //使用Cookie::也可以获取,引入Illuminate\Support\Facades\Cookie; return Cookie::get('laravel_session'); ``` 注意: > Laravel 中cookie 都是加密的,原生cookie 只能获取加密信息 如果想某个cookie `不加密`,在中间件文件夹设置:`Http/Middleware/milldelEncryptCookies.php` ```php protected $except = [ // 'name' ]; ``` 2、使用 `response()` 方法,可以 `创建cookie` : ```php //response()方法写入一个cookie return response('Hello Cookie')->cookie('name', 'Mr.Lee', 10); ``` > 参数3,是过期时间,已分钟为单位 > 这里必须有return,否则无法写入 一般不用这个。 3、使用 `Cookie::queue()` 方法来写入cookie; ```php //推荐这个,清爽很多 Cookie::queue('age', 100, 10); ``` 4、使用 `助手函数cookie()` 来创建cookie 实例,然后再写入,更加灵活; ```php //助手函数,创建一个实例,让写入可以更加灵活 $cookie = cookie('gender', '男', 10); //这里可以对$cookie做一系列处理 //最后写入 Cookie::queue($cookie); ``` 助手函数完整版: ```php //完整版,后面四种:路径,域名,https,仅http cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly) ``` ### 16.2 使用Session 1、首先,启动Web 后,默认会有session,通过下面代码获取所有; ```php //使用request(): return request()->session()->all(); //也可以使用: return Session::all(); ``` 返回结果: ```json { "_token": "RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC", "_previous": { "url": "http://127.0.0.1:8000/session/index" }, "_flash": { "old": [], "new": [] } } ``` 2、使用 `get()` 获取某一个session; ```php //获取其中一个session return request()->session()->get('_token'); //下面这个方法也可以 return Session::get('_token');//输出:RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC //参数2,闭包设置默认值 return request()->session()->get('name', function () { return 'no session name'; }); //输出:no session name ``` 3、`助手函数session()`,可以获取并可以设置默认值 ```php //获取session 值 return session('_token');//输出:RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC //获取session 值并设置默认值 return session('name', 'no session name');//输出:no session name ``` 4、判断是否存在 `session` 有两种方案: ```php //判断是否存在且不为null return Session::has('name'); return request()->session()->has('name'); //支持request()方式; //判断是否存在,即使是null return Session::exists('name'); return request()->session()->exists('name'); //支持request()方式; ``` 5、可以使用`助手函数传递数组`的方式或 `put()` 方法,来 `存储session` 值; ```php //使用助手函数传递数组 session(['name1' => '张三']); //使用put()方式 Session::put('name2', '李四'); //支持request()存储 request()->session()->put('name3', '王五'); //看看结果 return Session::all(); ``` 结果: ```json { "_token": "RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC", "_previous": { "url": "http://127.0.0.1:8000/session/index" }, "_flash": { "old": [], "new": [] }, "name1": "张三", "name2": "李四", "name3": "王五" } ``` 6、使用 `push()`方法,可以存储数组,支持 `request()`方式; ```php //session 数组方式 Session::push('info.name', '张三'); //同:request()->session()->push('info.name', '张三') Session::push('info.name', '李四'); //同:request()->session()->push('info.name', '李四') Session::push('info.name', '王五'); //同:request()->session()->push('info.name', '赵六') //看看结果 return Session::all(); ``` 结果: ```json { "_token": "RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC", "_previous": { "url": "http://127.0.0.1:8000/session/index" }, "_flash": { "old": [], "new": [] }, "info": { "name": [ "张三", "李四", "王五" ] } } ``` 8、使用 `flash()` 方法,`获取后自动删除`,支持request()方式; ```php //存储的session 只能被获取一次,然后自动删除,flash 也称为闪存数据 Session::flash('name', '张三'); //看看结果 return Session::all(); ``` 这时,执行结果为: ```php { "_token": "RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC", "_previous": { "url": "http://127.0.0.1:8000/session/index" }, "_flash": { "old": [], "new": [ "name" ] }, "name": "张三" } ``` 然后将上面的创建flash的代码注释,刷新网页,结果为: ```php { "_token": "RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC", "_previous": { "url": "http://127.0.0.1:8000/session/index" }, "_flash": { "old": [ "name" ], "new": [] }, "name": "张三" } ``` 然后再刷新一下,结果为: ```php { "_token": "RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC", "_previous": { "url": "http://127.0.0.1:8000/session/index" }, "_flash": { "old": [], "new": [] } } ``` 就是这么个过程。 9、如果使用`闪存数据`,本次请求不要立刻自行删除,可以使用reflash(); ```php //本次请求获取,不要删除数据,给下一次请求时再自行删除,这是保存所有闪存数据 Session::reflash(); //保存单独的删除数据 Session::keep(['name']); ``` 示例: 首先创建两个闪存数据: ```php Session::flash('name', '张三'); Session::flash('id', '10001'); //看看结果 return Session::all(); ``` 结果为: ```json { "_token": "RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC", "_previous": { "url": "http://127.0.0.1:8000/session/index" }, "_flash": { "old": [], "new": [ "name", "id" ] }, "name": "张三", "id": "10001" } ``` 修改代码为: ```php //Session::flash('name', '张三'); //Session::flash('id', '10001'); //保存单独的删除数据 Session::keep(['name']); //看看结果 return Session::all(); ``` 结果为: ```json { "_token": "RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC", "_previous": { "url": "http://127.0.0.1:8000/session/index" }, "_flash": { "old": { "1": "id" }, "new": [ "name" ] }, "name": "张三", "id": "10001" } ``` 然后修改代码为: ```php //Session::flash('name', '张三'); //Session::flash('id', '10001'); //保存单独的删除数据 //Session::keep(['name']); //看看结果 return Session::all(); ``` 结果为: ```php { "_token": "RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC", "_previous": { "url": "http://127.0.0.1:8000/session/index" }, "_flash": { "old": [ "name" ], "new": [] }, "name": "张三" } ``` 再刷新一下,name没了。嗯,就是这么个过程。 10、使用 `forget()` 可`以删除一条或多条session 数据`,支持request()方式; ```php //删除一条数据 Session::forget('name'); //多条:Session::forget(['name']) return Session::get('name'); //删除一条数据,并返回 Session::pull('info'); //删除所有数据 Session::flush(); ``` 示例: ```php //添加几个测试数据: Session::put('id', '10001'); Session::push('info.name', '张三'); Session::push('info.name', '李四'); Session::push('info.name', '王五'); //看看结果 return Session::all(); ``` 输出: ```json { "_token": "RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC", "_previous": { "url": "http://127.0.0.1:8000/session/index" }, "_flash": { "old": [], "new": [] }, "id": "10001", "info": { "name": [ "张三", "李四", "王五" ] } } ``` 测试1: ```php Session::forget('id'); //看看结果 return Session::all(); ``` 测试1结果(id被删除): ```json { "_token": "RA5s7slX29z04Yoq5B1P7ZJWHecjfRppacaKTsZC", "_previous": { "url": "http://127.0.0.1:8000/session/index" }, "_flash": { "old": [], "new": [] }, "info": { "name": [ "张三", "李四", "王五" ] } } ``` 测试2: ```php return Session::pull('id'); ``` 测试2结果: ``` 10001 ``` > 这里删除了一条数据,并返回了删除的数据 测试3: ```php //删除所有数据 Session::flush(); //看看结果 return Session::all(); ``` 测试3结果: ```json [] ``` > 全删除了,只剩下一个空数组了哈哈哈 11、 使用 `regenerate()` 可以`重新生成SessionID`; 上面清空了session,然后重新生成: ```php //重新生成SessionID Session::regenerate(); //看看结果 return Session::all(); //获取SessionID, return Cookie::get('laravel_session'); ``` 输出: ```json { "_previous": { "url": "http://127.0.0.1:8000/session/index" }, "_flash": { "old": [], "new": [] }, "_token": "Gr28KwYuEgDvs0k0N4RAWSkrnO7zDEQCnNCYS3S3" } ``` > 和上面比较一下,token已经变了。 以上。 本文采用创作共用版权 CC BY-NC-SA 3.0 CN 许可协议,转载或复制请注明出处! -- 展开阅读全文 --