1. session session技术 思考问题? 我们在浏览网站,去购物的时候,张三和李四,可以购买不同的商品,并且在查看购物车时候,可以看到各自购买的商品? 思路1: 数据库 2. cookie3 -?? 当你登陆某个网站,你可以在任何一个网页,查看登陆的名字? 思路 1. 数据
1. session
思考问题?
我们在浏览网站,去购物的时候,张三和李四,可以购买不同的商品,并且在查看购物车时候,可以看到各自购买的商品?
思路1: 数据库 2. cookie3 ->??
当你登陆某个网站,你可以在任何一个网页,查看登陆的名字?
思路
1. 数据库
2. cookie
问题: 安全性/ 在网络传数据(带宽的问题)
3. 解决之道->session.
在默认情况下session文件将被保存在c:/windows/temp
u 思考的问题?
用户无需登陆,就可以访问到我们的管理页面,并且可以对用户进行curd操作.
解决之道->session
u Session的初步介绍
① Session是服务器端技术
② 注意:一个会话对应一个Session文件
③ 原理示意图:
④ session的基本用法(crud) 增删改查.
3.1 如何保存session 数据
代码 :
echo "
***演示如何保持session数据**
";
//1.初始化session
session_start();
//2.保存数据
$_SESSION['name']="shunping";
//session文件中可以保存dobule, integer, bool, array, object
//保存inter bool
$_SESSION['age']=100;
$_SESSION['isBoy']=true;
//保存数据
$arr1=array("北京","小明","hello");
$_SESSION['arr1']=$arr1;
//保存一个对象到session文件
class Dog{
private $name;
private $age;
private $intro;
function __construct($name,$age,$intro){
$this->name=$name;
$this->age=$age;
$this->intro=$intro;
}
}
$dog1=new Dog("大狗",5,"很好的一只狗");
$_SESSION['dog1']=$dog1;
echo "保存ok";
?>
对代码说明:
* 保存的数据格式:
name|s:8:"shunping";age|i:100;isBoy|b:1;arr1|a:3:{i:0;s:6:"北京";i:1;s:6:"小明";i:2;s:5:"hello";}dog1|O:3:"Dog":3:{s:9:"
name 就是 key
s: 表示数据类型
8: 数据大小
* 我们的session中可以保存的数据类型是
string,integer,double , bool array, object.
3.2 如何获取session的数据
代码
echo "
获取session数据
";
require_once "Dog.class.php";
session_start();
//获取session
//1.把所有的session获取
echo "";
print_r($_SESSION);
echo "";
//2.通过key来指定获取某个值
echo "
名字是:".$_SESSION["name"];
$arr1=$_SESSION['arr1'];
echo "
数组的数据是:";
foreach($arr1 as $key=>$val){
echo "
--$val";
}
//3.取出对象
//保存一个对象到session文件
$xiaogou=$_SESSION['dog1'];
echo "
小狗的名字:".$xiaogou->getName();
?>
小结:
(1) 要使用session,都需要初始化 sesssion_start();
(2) session文件中可以放入多个 keyval对 , 注意 key不能重复,val可以是基本数据类型,和array,对象.
(3) 如果我们要取出对象,则需要实现申明一下类的定义信息.
3.3更新session数据
//更新
session_start();
$_SESSION['name']="顺平";
echo "更新成功!";
?>
3.4 删除session数据
//删除sessoin信息
//1.删除某一个keyval
session_start();
//unset($_SESSION['name']);
//2.删除所有的 keyval
//这样就会把当前这个浏览器对应的session文件删除.
session_destroy();
echo "删除session成功!";
?>
思考: 如果没有手动删除session,那么系统是怎么维护.
u session的细节讨论
① session数据默认存放时间是1440秒, 这个时间可以通过 php.ini文件来修改
session.gc_maxlifetime =1440
时间可以自定 ,修改后,也要重新启动apache,
这个时间是指定在1440秒内,没有使用session文件,该session才会被当做垃圾,从而被回收.
② session 文件存放的路径是可以修改php.ini 文件
session.save_path ="c:/mysession"
修改后,需要重新启动apache
③ 在使用session的时候,应当保证 对session进行初始化,
方法1; 在需要使用session页面都写入 session_start();
2. 在php.ini 文件中,配置session.auto_start=1 (不推荐)
④ 服务器是怎样实现,一个session文件为一次会话服务的,原理是
u session的实际运用
购物车实际案例—给出界面,然后实现为后面讲解禁用cookie后
还能使用session的知识点.
要求不使用数据库,使用session完成.
代码:
MyHall.php
//购物大厅
echo "欢迎购买
";
echo "
";
echo "
";
echo "
";
echo "
";
echo "
";
echo "
?>
ShowProcess.php
//接收用户购买请求,并把书保存到session中.
$bookid=$_GET['bookid'];
$bookname=$_GET['bookname'];
//保存到session中
session_start();
$_SESSION[$bookid]=$bookname;
echo "
购买商品成功!";
echo"
返回购物大厅继续购买";
?>
ShowCart.php
echo "购物车商品有
";
session_start();
foreach($_SESSION as $key=>$val){
echo"
书号--$key 书名--$val";
}
?>
再请思考一个问题?:
如果用户禁用cookie?
当用户禁用cookie后,服务器每次 session_start() 都会 创建一个全新的seesion文件,后果就是无法让多个页面php,去共享同一份session文件.
如何解决问题? 从cookie sessoin 和http协议入手解决
请问? 如果客户端禁用cookie,怎样实现session技术共享多个页面?
答:
(1)在每个超链接上添加一个PHPSESSID=sesssionId;
同时在每个页面加入:
if(isset($_GET[‘PHPSESSID’]){
//设置sesssion_id
session_id($_GET[‘PHPSESSID’]);
}
session_start();...
(2) 使用常量SID
使用方法如下:
在超链接 action header(“Location: xx”) 可以直接拼接 SID常量即可
echo"西游记
";
(3) 可以启用session.use_trans_sid 指定是否启用透明 SID 支持 即可以这样设置
ssssion. use_trans_sid = 1 ,这样重启apache即可生效.
具体处理代码:
MyHall.php
if(isset($_GET['PHPSESSID'])){
session_id($_GET['PHPSESSID']);
}
session_start();
//echo "sid====".SID;
//购物大厅
echo "欢迎购买
";
echo "
";
echo "
";
echo "
";
echo "
";
echo "
";
echo "
?>
ShopProcess.php
//接收用户购买请求,并把书保存到session中.
//保存到session中
if(isset($_GET['PHPSESSID'])){
session_id($_GET['PHPSESSID']);
}
session_start();
$bookid=$_GET['bookid'];
$bookname=$_GET['bookname'];
$_SESSION[$bookid]=$bookname;
echo "
购买商品成功!";
echo "
?>
ShowCart.php
echo "购物车商品有
";
//这里不能让服务器创建一个新的session
if(isset($_GET['PHPSESSID'])){
session_id($_GET['PHPSESSID']);
}
session_start();
foreach($_SESSION as $key=>$val){
echo "
书号--$key 书名--$val";
}
?>
u 再看一个session的实际运用案例
如何防止用户非法登录.
思路如图:
代码
loginProcess.php 增加:
if($name!=""){
//把登陆信息写入cookie'loginname':$name
//把登陆表 把登陆的人ipid..
//合法
session_start();
$_SESSION['loginuser']=$name;
header("Location:empManage.php?name=$name");
exit();
}
在编写commmon.php文件中添加了一个函数
//把验证用户是否合法封装函数
function checkUserValidate(){
session_start();
//先写在封
if(empty($_SESSION['loginuser'])){
header("Location:login.php?errno=1");
}
}
在需要防止用户非法登录页面中引入这样两句(这两句话,放在页面的开头)
require_once'common.php';
checkUserValidate();
u session技术的实际运用
验证码
为什么我们需要验证码
1. 防止登录时,恶意攻击
2. 防止灌水.
.......
验证码实现思路图分析:
代码: 直接在我们雇员管理系统中增加验证码功能:
1. checkCode.php 这个文件引入到你的项目中
3. 在loginProcess.php 页面中,添加对验证码的处理
代码
//先看看验证码是否ok
session_start();
if($checkCode!=$_SESSION['myCheckCode']){
header("Location:login.php?errno=2");
exit();
}
u php.ini文件中关于cookie和session的设置
① session.name
该配置用于设置session的名字,这个值可以通过 session_name() 来获取.
② session.use_trans_sid 默认是0,
session.use_trans_sid= 0
说明:给每个url启用 session名=sessionId ,对安全有影响,不推荐开启
③ sessoin.save_path = 路径
可以配置把网站的session文件放在哪个目录下.
④ 三个一组:
session.gc_maxlifetime= 1440
说明:session默认最大生命周期
session.gc_probability= 1
session.gc_divisor= 1000
说明: 上面三个配置,共同来决定,session的垃圾回收清除.
原理图 机制
说明: 当某个用户操作session的时候,会使用到session_start(), 该函数会调用gc ,但是其概率是 session.gc_probability/ session.gc_divisor
原因是: 对于一个网站说,有很多用户访问,因此当大量用户访问的时候,概率很多. 如果网站的规模越大,我们建议 把这个概率设置越小.
演示
session.gc_maxlifetime= 30
说明:session默认最大生命周期
session.gc_probability= 1000
session.gc_divisor= 1000
⑤ session.cookie_lifetime= 0
该设置可以指定cookie默认生命周期,默认是0,表示当关闭浏览器后,该cookies失效,你可以这样
setcookie(“名字”,”val”,time()+3600);
setcookie(“名字”,”val”);
u 自定义会话处理器
说: session 的各种操作,都可以同自定义会话处理来自己决定, 靠
session_set_save_handler
如果你要自定义处理session,需要在php.ini文件中做一个设置.
session.save_handler= [files\user]
需求: 为什么session文件打头是sess_* ,我们能
不能自己定义session文件名? hsp_*
代码如下:
function open($save_path, $session_name)
{
global $sess_save_path;
$sess_save_path = $save_path;
return(true);
}
function close()
{
return(true);
}
function read($id)
{
global $sess_save_path;
$sess_file ="$sess_save_path/hsp_$id";
return (string)@file_get_contents($sess_file);
}
function write($id,$sess_data)
{
//echo "id=$id ********************数据 $sess_data
";
global $sess_save_path;
$sess_file ="$sess_save_path/hsp_$id";
if ($fp = @fopen($sess_file, "w")){
$return = fwrite($fp, $sess_data);
fclose($fp);
return $return;
} else {
return(false);
}
}
//session_destory()
function destroy($id)
{
global $sess_save_path;
$sess_file ="$sess_save_path/hsp_$id";
return(@unlink($sess_file));
}
function gc($maxlifetime)
{
global $sess_save_path;
foreach(glob("$sess_save_path/hsp_*") as $filename) {
if (filemtime($filename) + $maxlifetime
@unlink($filename);
}
}
return true;
}
//session_set_save_handler有六个回调函数.
session_set_save_handler("open","close", "read", "write", "destroy","gc");
session_start();
$_SESSION['aa']="helloworld";
?>
通过该案例: 我们充分体会 session的操作流程,是可以修改...
session数据可以存放的位置
(1) 文件
(2) 数据库
(3) 内存(memcache)
(4) 网络文件nfs
u sesson和cookie的对比:
2. cookie
cookie①-cookie原理介绍 创建cookie 获取cookie
什么是会话
打开浏览器,访问某个网站的很多页面(通过点击超连接), 当你关闭浏览器后,一个会话结束.
思考一个问题?
在一个会话过程,中,用户会产生一些数据,比如购物车.每个用户查看购物车的时候,看到自己的选择,怎么实现?
思路:
再思考一个问题?
为什么youku可以保存你上次看过的电影?
解决之道
会话技术-cookiesession =>http协议
问题: 如何提示用户上次登录网站的时间,如何保存上次用户浏览的信息,如何保证用户在一定时间内,不用反复登录...
cookie
cookie的初步介绍
1. cookie是保存在客户端.
2. 画图说明
118.jpg (95.33 KB, 下载次数: 0)
下载附件
2 分钟前 上传
3. cookie的基本使用(curd)
3.1 如何创建cookie
代码cookie1.php
//演示如何创建cookie信息
//把用户名和密码保存到客户端的cookie
//这个函数用于保存cookie
//第一个参数表示cookie一个key 第二个参数表示 val,第三个参数表示cookie值,在
//客户端保存时间,按秒计算
// key value
// key value
//.....
setCookie("name","shunping",time()+3600);
setCookie("password","12345",time()+30);
setCookie("address","北京",time()+300);
echo "保存成功!";
?>
对代码说明
① 当浏览器访问 cookie1.php页面的时候,我们的服务器就会以
Set-Cookie: name=shunping; expires=Wed, 21-Sep-201107:53:25 GMT 回送http响应,当浏览器获取到该信息后,就会保存该cookie 的新到
本机的 c:/xxx/admin/cookies文件.
② 如果我们如果没有该时间(第三个参数)
cookie不会保存到客户端,当浏览器的会话结束,我们的cookie就失效.
③ cookie能保存什么样的信息,就是字符串.
④ 客户端可以保存多个keyvalue 对
④ cookie也可以保存中,默认将会对中文进行 urlencode进行编码
⑥ cookie 可以有多个 键值 对,可以给不同的键值 ,指定不同的有效时间.
3.2 如何从客户端获取保存的cookie信息 (查询)
代码:
//获取cookie信息
echo "
";";print_r($_COOKIE);
echo "
//获取指定的key对应的值
$name=$_COOKIE['name'];
echo "name=".$name;
?>
对代码说明:
① 如果cookie有效时间到,则不能取出.
② 客户端cookie信息是怎样传递给服务器
通过 http协议的
Cookie: name=shunping
这个机制是http协议 规定