Maison  >  Article  >  php教程  >  php session cookie

php session cookie

WBOY
WBOYoriginal
2016-06-06 19:54:33790parcourir

1. session session技术 思考问题? 我们在浏览网站,去购物的时候,张三和李四,可以购买不同的商品,并且在查看购物车时候,可以看到各自购买的商品? 思路1: 数据库 2. cookie3 -?? 当你登陆某个网站,你可以在任何一个网页,查看登陆的名字? 思路 1. 数据

1.  session 

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 这个文件引入到你的项目中

 

php session  cookie

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协议 规定

 



Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn