Heim  >  Artikel  >  php教程  >  php session cookie

php session cookie

WBOY
WBOYOriginal
2016-06-06 19:54:33790Durchsuche

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

 



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn