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