laravel由浅入深第11课: Cookie

一:复习一下cookie

php官方文档
setcookie
setrawcookie

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )

一共7个参数

参数 解释
name cookie的名字,如'hello'
value cookie的值,如'world'
expire 过期时间,是一个时间戳,一般写成time+60*60这种格式
1. 默认为0,表示当浏览器整个关闭时,存在客户端浏览器中的cookie就会删除,当浏览器开着时就可以使用$_COOKIE['hello']获取,只要浏览器不关,就可以读取,关闭后重新打开浏览器就读不到了
2. 负时间戳如time()-1,表示不保存,如setcookie('hello','world',time()-8,'/');这样其实是没有保存cookie,是永远也获取不到
3. 正时间戳,如 time()+30表示只在浏览器储存30秒,不管浏览器是否关闭,过了30秒就删除
path 指定在哪个路径下可以读取设定的cookie,默认是值是当前目录,可以指定根目录,也可以指定其它任何目录
1. 当前目录(默认),表示只有当前目录及当前目录的子目录中的文件中可以读取,如未设,那么在public/a/a.php中setcookie('hello','world',time()+30);
子文件夹中/a/x/x.php就可以使用$_COOKIE['hello']读取,
同级文件/a/a2.php中也可以读取,
同级文件夹下/b/b.php中不能读取
父文件夹下/home.php中不可以读取
2. "/" 表示所有地方都可以读取
3. 指定为其它目录,如public/a/a.php中 setcookie('hello','world',time()+30,'/b');,这样只有网站根目录public/b目录下的文件及其子目录下的文件才可以读取hello这个cookie,/home.php中读取不到,即使是设置cookie的文件/a/a.php中也读取不到
domain 域名字,记住为了安全,不能跨域设置,有关跨域设置参考
secure 安全,为true时,只有https协议才可读取该cookie
httponly 设为1后,javascript和flash等程序就不能读取该cookie,否则js中就可以读取,最简单的方法是在浏览器的地址栏中输入 javascript:alert(document.cookie)测试

二: Cookie对象

如何生成一个Cookie对象?

方法1.使用助手函数
$a = cookie('cs', '长沙是湖南的省会',5);//新建一个Cookie对象,过期时间为5分钟
return Response::make('湖南省')->cookie($a); //将Cookie对象添加到响应对象中
方法2. 使用Facade
$b = Cookie::make('wh', '武汉是湖北的省会', 5);//参数格式:$name, $value, $minutes
$c = Cookie::forever('bj', '北京是中国的首都');
return Response::make('湖北省')->cookie($b)->withCookie($c); //将Cookie对象添加到响应对象中

如何删除cookie?

`
Cookie::forget('wh')
`

三: Response中的Cookie[向客户端的浏览器写入cookie]

如何生成一个Response对象?

方法1.使用助手函数【推荐】

response()->make() 生成一个空的Response对象,response()只是生成一个工厂
response(内容,状态码,headers) 生成一个有内容的Response对象,内容为字符串,状态码为一整数默认为200,headers为数组

方法2.使用Facade

Response::make()
Response::make(内容,状态码,headers)

方法3.使用app容器

app(ResponseFactory::class)->make();
app(ResponseFactory::class)->make(内容,状态码,headers);

Response对象向浏览器写入cookie

Response::make('湖北省')->withCookie($b)->withCookie($c);//支持链式添加
Response::make('湖北省')->cookie($b)->cookie($c);//支持链式添加

总结:一般先新建一个Cookie对象,再cookie(Cookie对象)或withCookie(ookie对象)

控制器中使用队列写入cookie【重点掌握】

上面的例子我是在控制器中返回一个Response对象,实际一般在控制器中是返回一个View对象,如

public function index() {
    Cookie::queue('wang', 'very good', 1);
    return view('home');
}

形式1: Cookie::queue('wang', 'very good', 1); //参数形式同setcookie()原生函数
形式2: Cookie::queue(Cookie::forever('bj', '北京是中国的首都')); //参数是一个Cookie对象
它实际上是使用了AddQueuedCookiesToResponse中间件,在中间件中对响应对象添加cookie;

四:Request中的Cookie[从客户端的浏览器读取cookie]

如何从Request中获取Cookie?

方法1: 使用Facade

Cookie::get('bj');

方法2: 使用request

$app['request']->cookie($key, $default)

完整例子
public function show(Request $a){
    print_r($a->cookie()); //未加密的cookie值
    print_r($_COOKIE); //加密的cookie值
    $forever = Cookie::get('forever');
    $temporary = Cookie::get('temporary');
    return  array('forever' => $forever, 'temporary' => $temporary, 'variableTest' => 'it works');
}

五:Cookie的加密和解密

cookie信息是保存在客户端的浏览器中,用户是可以看得到的,所以cookie里面不能放密码等敏感信息,即使不是敏感信息,也不想让人看到,怎么办,就要使用到对称加密技术,响应对象将加密过的cookie存到浏览器中,请求对象读取cookie后解密。
有关cookie的加密和解密过程参考:\App\Http\Middleware\EncryptCookies::class,实际上是使用IlluminateEncryptionEncrypter对象加密和解密的

protected $middlewareGroups = [
        "web" => [
            \App\Http\Middleware\EncryptCookies::class, //加密解密Cookie的值
            ...

        ],

请在Kernel中配置好中间件,如果不想加密,请注释上面这行


laravel由浅入深
专业讲解流行的php框架,laravel5.5

0he1.com在线课堂

596 声望
80 粉丝
0 条评论
推荐阅读
基于verdaccio的npm私有仓库搭建和使用总结
资源 官方:[链接] 参考:[链接] 参考:[链接] 参考:[链接] 原来用sinopia搭建的私服,但sinopia两年年停止维护了,现在改为verdaccio。使用verdaccio也超级简单,只需几分钟就可以搭建一个私服,适合公司内部不...

advance1007阅读 9.4k

Laravel入门及实践,快速上手ThinkSNS+二次开发
【摘要】自从ThinkSNS+不使用ThinkPHP框架而使用Laravel框架之后,很多人都说技术门槛抬高了,其实你与TS+的距离仅仅只是学习一个新框架而已,所以,我们今天来说说Laravel的入门。

ThinkSNS1阅读 2.4k

Next.js-cookie鉴权+续期1
前端通过axios(或者fetch也可以)调用后台接口的时候通过request请求头header的cookie属性(前端是你的浏览器中存在Cookie)带到后台,前提是要同源,如:前端地址是:www.baidu.com,后台是:www.baiud.com/api或者...

Awbeci阅读 2.3k

Javascript-了解Cookie
最近使用next.js来开发前端网站,在登录环节发现cookie的存储和跨域存在问题,一直没弄懂cookie的原理,看了网上好多大佬的文章,大有收获分享给大家。

Awbeci阅读 1.7k

cookie 时效无限延长方案
自动化测试有2种形式,接口自动化和UI自动化。而UI自动化经常会被登录节点堵塞,例如验证码、图形、滑块等,尽管有些方式可以识别图形和定位滑块位置,但成功率都不高,无法真正意义上实现自动化执行;而http接口...

京东云开发者1阅读 436

封面图
@RequestMapping 如果 不添加任何条件,默认是get还是post?
如果在使用 @RequestMapping 注解时,没有指定具体的 HTTP 请求方法,那么默认情况下,这个请求映射将会接收 GET、POST、PUT、DELETE、HEAD、OPTIONS 等所有 HTTP 请求方法。例如,下面的 hello 方法就没有指定具...

无知阅读 828

Goravel ORM 新增模型关联,用 Golang 写关联也可以跟 Laravel 简单
Goravel 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。框架风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可以愉快的玩转 Golang!

韩同学的简单逻辑阅读 734

0he1.com在线课堂

596 声望
80 粉丝
宣传栏