对于PHP的初学者而言,经常因为session和cookie而头大,因此。
<?php
/**
cookie
session
总结
session的工作原理:接受cookie携带的session ID ,验证合法性
如果本地浏览器禁用了cookie,session也是可以用的,但是不能使用本地浏览器传值,
可以通过URL地址重写 sessionID
URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态
其实说白了session就是用来保存会话的cookie。
详细信息可以参看https://www.zhihu.com/question/19786827
**/
1.用户进行 登录 退出 的时候需要用到
2.cookie就是吃饭用的牌子
浏览器给服务器传数据时, 服务器 给浏览器一个 cookie,数据就保存在cookie里,浏览器再次访问的时候,传给服务器cookie
session就是超市用的柜子
浏览器给服务器传数据时, 服务器 给浏览器一个 很难识别cookies ,并且把数据保存在服务器中, 浏览器再次访问的时候,把复杂的cookie传给服务器,服务器调取数据
3.cookie 的设置,改变,销毁 都是通过 setcookie() 这个函数来实现的
cookie 的读取,是通过 $_COOKIE 来读取的
4.setcookie()的参数
setcookie(name, value, time(), path);
/*
setcookie()可以由2个参数,3个参数,4个参数,5各参数
setcookie($name, $value, $expire=0, $path, $domain, $secure = false, $httponly=false)
*/
//2个参数设置的cookie,浏览器关闭,cookies就会失效
setcookie('age', 29);
//3个参数设置cookies,第3个参数就是cookie的保存时间,以时间戳为单位,可长可短,且不受浏览器开关限制
setcookie('school', 'MBA', time()+3600); //15秒后消失,关闭浏览器,MBA还在,但是age不存在了
echo "cookies设置成功";
//4个参数设置cookie,cookie的读取范围,默认在子目录下都能读到,
//如果想要让cookie整栈有效,1.可以在根目录下设置setcookie
// 2.也可以使用第四个参数来指定 cookie 生效路径
setcookie('golbal', 'any where!', time()+3600, '/'); // '/'表示的是根目录的意思
//5个参数, cookie是不能跨域名的(不同网站之间不能通用。。保证安全性)
//比如sohu.com的cookie,不能发到sina.com使用,
//但是可以在一个域的子域名下保存,需要用到第5个参数
//比如: setcookie('name', 'value', time()+200, '/', 'sina.com.cn')
//这个 cookie 可以在jushi.sina.com.cn 下使用
// 也可以在 book.sina.com.cn 下使用 ...等等
//一般只用前四个,第五个用于大网站,但是大网站一般有专门的ssn一站式处理方案
/**
名称: name
内容: 29
主机: localhost
路径: /shangcheng/day16/
发送条件: 任意类型的连接
过期时间: 在会话结束时
1.名字,2.值, 3.事件,4.路径
**/
//cookie的失效可以改变时间,使用负数或者0.
setcookie('school', 'MBA', 0);
5.cookie 是服务器给浏览器牌子,下次访问时,浏览器拿着牌子访问
设置cookie, 使用setcooki()
使用cookie, 使用$_COOKIE[] 超级全局变量
那么问题来了,如果 cookie 被篡改了,后果很严重
所以,cookie往往记住用户名,浏览历史等等安全性不高的地方
如果要防范的话,可以用session技术,也可以用一些加密机巧
6.session
/**
1.浏览器 发送数据给 服务端,
服务端 储存数据 并且产生一个 凭证 返回给 浏览器
2.浏览器 再次访问时,给服务器凭证
服务器 利用凭证取出数据,传给浏览器
**/
7.
cookies 篡改是在浏览器上修改,危险
session 篡改是在服务器中修改,属于把系统(服务器)入侵了,
凭证比较乱是为了各个客户之间可以猜出来,防止偷取客户端凭证(PHPSESSID) //也就是(sessionid)
当我们的sessid被偷取的时候,赶紧退出后重新登录
8.session的详细用法
/**
session 的创建、修改、销毁
1.都必须有 session_start();
2.session_start() 之后,$_SESSION 就可以添加、删除、修改了,可以当做普通数组修改
cookie的操作只能通过 setcookie() 来操作
**/
/*
销毁 $_SESSION
1.把箱子清空
2.把箱子毁掉
*/
1.单独销毁某一个单元
unset($_SESSION['user'])
2.把箱子清空(文件变空白了)
$_SESSION = array();
3.利用函数把箱子清空,效果同 2
session_unset();
4.把箱子毁掉
session_destroy();
// $_SESSION 的生命周期
session 两个方面发挥作用:
1. 客户端的 cookie
2. 服务器端的 session
让session 失效的话,两个方面分析
1.在 php.ini 中,可以控制cookies的生命周期,以秒为单位
session.cookies_lifetime = 15
如果用户篡改声明周期,为1年,我们是无法判断的
如果严格控制session有效期半个小时,可以这么做
利用时间戳 $_SESSION['time'] = 登录的时间戳,然后检验session的开始时间
为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。
Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。
/**
session的有效路径,取决于cookie,只要cookie有效,那么session就能读到
在php.ini下,指定了凡是关于sessionid的cookie的有效路径是根路径
/*
; The path for which the cookie is valid.
; http://php.net/session.cookie-path
session.cookie_path = /
*/
/**
cookie 中只能存放 string 数字 之类类型的标量
session 可以存放数组,对象之类的,除了不能存储 资源类型 之外的其他7种都可以
如果我们把对象写入session中,那么读取对象的页面中也应该有这个对象的类的声明才可以,
否则,从session中分析出一个对象,但是却没有和他相对应的类,就会提示:
__PHP__Incomplete_Class Object 提示
class Dog{
public $leg = 4;
} //读取的时候,只需要把类拿过去就OK了
$dog = new Dog();
$_SESSION['dog'] = $dog;
**/
cookie session
储存地点 客户端 服务器
安全性 低 高
储存类型 不能存数组、资源、对象 除了资源
创建方式 setcookie() session_start()开启,然后当做数组用
读取 $_COOKIE $_SESSION
销毁 setcookie('k','y',time()-1) $_SESSION 赋值或者函数(4种方式)
在使用cookie之前,不能有任何信息出现,空白也不可以,报错之后如果还没有,检查bom信息