一:复习一下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中配置好中间件,如果不想加密,请注释上面这行


advance100
599 声望80 粉丝

0he1.com在线课堂