在默认情况下session文件将被保存在c:/windows/temp
u 思考的问题?
用户无需登陆,就可以访问到我们的管理页面,并且可以对用户进行curd操作.
解决之道->session
u Session的初步介绍
① Session是服务器端技术
② 注意:一个会话对应一个Session文件
③ 原理示意图:
① session的基本用法(crud)增删改查.
1.1 如何保存session 数据
代码 :
<?php
echo "<br/>***演示如何保持session数据**<br/>";
//1.初始化session
session_start();
//2.保存数据
$_SESSION['name']="shunping";
//session文件中可以保存dobule, integer, bool, array, object
//保存interbool
$_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.
1.2 如何获取session的数据
代码
<?php
echo "<br/>获取session数据<br/>";
require_once "Dog.class.php";
session_start();
//获取session
//1.把所有的session获取
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
//2.通过key来指定获取某个值
echo "<br/>名字是:".$_SESSION["name"];
$arr1=$_SESSION['arr1'];
echo "<br/>数组的数据是:";
foreach($arr1 as $key=>$val){
echo"<br/>--$val";
}
//3.取出对象
//保存一个对象到session文件
$xiaogou=$_SESSION['dog1'];
echo "<br/>小狗的名字:".$xiaogou->getName();
?>
小结:
(1) 要使用session,都需要初始化sesssion_start();
(2) session文件中可以放入多个 key<==>val对 , 注意 key不能重复,val可以是基本数据类型,和array,对象.
(3) 如果我们要取出对象,则需要实现申明一下类的定义信息.
3.3更新session数据
<?php
//更新
session_start();
$_SESSION['name']="顺平";
echo "更新成功!";
?>
3.4 删除session数据
<?php
//删除sessoin信息
//1.删除某一个key<==>val
session_start();
//unset($_SESSION['name']);
//2.删除所有的key<==>val
//这样就会把当前这个浏览器对应的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
<?php
//购物大厅
echo"<h1>欢迎购买</h1>";
echo"<a href='ShopProcess.php?bookid=sn001&bookname=天龙八部'>天龙八部</a><br/>";
echo"<a href='ShopProcess.php?bookid=sn002&bookname=红楼梦'>红楼梦</a><br/>";
echo"<a href='ShopProcess.php?bookid=sn003&bookname=西游记'>西游记</a><br/>";
echo"<a href='ShopProcess.php?bookid=sn004&bookname=聊斋'>聊斋</a><br/>";
echo"<hr/>";
echo"<a href='ShowCart.php'>查看购买到的商品列表</a>";
?>
ShowProcess.php
<?php
//接收用户购买请求,并把书保存到session中.
$bookid=$_GET['bookid'];
$bookname=$_GET['bookname'];
//保存到session中
session_start();
$_SESSION[$bookid]=$bookname;
echo"<br/>购买商品成功!";
echo"<br/><a href='MyHall.php'>返回购物大厅继续购买</a>";
?>
ShowCart.php
<?php
echo"<h1>购物车商品有</h1>";
session_start();
foreach($_SESSIONas $key=>$val){
echo"<br/> 书号--$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 "<ahref='ShopProcess.php?bookid=sn003&bookname=西游记&".SID."'>西游记</a><br/>";
(3) 可以启用session.use_trans_sid 指定是否启用透明 SID 支持 即可以这样设置
ssssion. use_trans_sid = 1 ,这样重启apache即可生效.
具体处理代码:
MyHall.php
<?php
if(isset($_GET['PHPSESSID'])){
session_id($_GET['PHPSESSID']);
}
session_start();
//echo "sid====".SID;
//购物大厅
echo "<h1>欢迎购买</h1>";
echo "<ahref='ShopProcess.php?bookid=sn001&bookname=天龙八部&".SID."'>天龙八部</a><br/>";
echo "<a href='ShopProcess.php?bookid=sn002&bookname=红楼梦&".SID."'>红楼梦</a><br/>";
echo "<ahref='ShopProcess.php?bookid=sn003&bookname=西游记&".SID."'>西游记</a><br/>";
echo "<ahref='ShopProcess.php?bookid=sn004&bookname=聊斋&".SID."'>聊斋</a><br/>";
echo "<hr/>";
echo "<a href='ShowCart.php?".SID."'>查看购买到的商品列表</a>";
?>
ShopProcess.php
<?php
//接收用户购买请求,并把书保存到session中.
//保存到session中
if(isset($_GET['PHPSESSID'])){
session_id($_GET['PHPSESSID']);
}
session_start();
$bookid=$_GET['bookid'];
$bookname=$_GET['bookname'];
$_SESSION[$bookid]=$bookname;
echo "<br/>购买商品成功!";
echo "<br/><ahref='MyHall.php?".SID."'>返回购物大厅继续购买</a>";
?>
ShowCart.php
<?php
echo "<h1>购物车商品有</h1>";
//这里不能让服务器创建一个新的session
if(isset($_GET['PHPSESSID'])){
session_id($_GET['PHPSESSID']);
}
session_start();
foreach($_SESSION as $key=>$val){
echo "<br/> 书号--$key 书名--$val";
}
?>
u 再看一个session的实际运用案例
如何防止用户非法登录.
思路如图:
代码
loginProcess.php 增加:
if($name!=""){
//把登陆信息写入cookie 'loginname':$name
//把登陆表把登陆的人ip id..
//合法
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 这个文件引入到你的项目中
2. 在login.php页面中添加一个<img/>标签 ,向checkCode.php发送请求
<imgsrc="checkCode.php"οnclick="this.src='checkCode.php?aa='+Math.random()"/>
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_*
代码如下:
<?php
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);
}
functionwrite($id, $sess_data)
{
//echo "id=$id ********************数据 $sess_data<br/>";
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()
functiondestroy($id)
{
global $sess_save_path;
$sess_file ="$sess_save_path/hsp_$id";
return(@unlink($sess_file));
}
functiongc($maxlifetime)
{
global $sess_save_path;
foreach(glob("$sess_save_path/hsp_*") as $filename) {
if (filemtime($filename) + $maxlifetime< time()) {
@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