zoukankan      html  css  js  c++  java
  • php Session方法实例

    如何通过Session对用户操作权限进行判断

    在大多数的网站开发过程中,根据实际的需要,需要划分管理员和普通用户对操作网站的权限。下面通过一个具体的代码实例进行一下全面的讲解。

    (1) 设计一个登陆的页面,添加一个form表单,使用POST方式进行参数传递, action 指向的数据处理页面为 default.php , 添加一个用户名文本框并命名为 user,添加一个密码域文本框并命名为 pwd ,通过submit按钮进行提交跳转,其主要的代码如下所示。

    <html>
    <head>
    <script type="text/javascript">
    
     function check(form){
    
         if(form.user.value == ""){
    
             alert("请输入用户名");
    
        }
    
         if(form.pwd.value == ""){
    
             alert("请输入密码");
    
        }
    
         form.submit();
    
    }
    
      </script>
    </head>
    <body>
    <form name="form1" method="post" action="default.php">
    
      <table width="520" height="390" border="0" cellpadding="0" cellspacing="0">
    
        <tr>
    
          <td valign="top">
    
            <table width="520" border="0" cellspacing="0" cellpadding="0">
    
              <tr>
    
                <td height="24" align="right">用户名:</td>
    
                <td height="24" align="left">
    
                  <input name="user" type="text" id="user" size="20">
    
                </td>
    
              </tr>
    
              <tr>
    
                <td height="24" align="right">密 码:</td>
    
                <td height="24" align="left">
    
                  <input name="pwd" type="password" id="pwd" size="20">
    
                </td>
    
              </tr>
    
              <tr align="center">
    
                <td height="24" colspan="2">
    
                  <input name="submit" type="submit" value="提交" onclick="return check(form);">
    
                  <input type="reset" name="reset" value="重置">
    
                </td>
    
              </tr>
    
              <tr>
    
                <td height="76">
    
                  <span>超级用户: admin &nbsp;密  码:111 </span>
    
                  <br>
    
                  <span>普通用户: cyy &nbsp;密  码:000 </span>
    
                </td>
    
              </tr>
    
            </table>
    
          </td>
    
        </tr>
    
      </table>
    
    </form>
    </body>
    </html>

    (2)在 “提交” 按钮的单击事件下,调用自定义函数 check() 来验证表单元素是否为空。这里使用了javascript代码进行验证。

    <script type="text/javascript">
    
     function check(form){
    
         if(form.user.value == ""){
    
             alert("请输入用户名");
    
        }
    
         if(form.pwd.value == ""){
    
             alert("请输入密码");
    
        }
    
         form.submit();
    
    }
    
     </script>

    (3) 提交表单元素到数据处理页 default.php。首先使用 session_start() 函数初始化 session变量,在使用 POST方法 接收表单元素的值,将获取的用户名和密码分别赋值给 session变量,其代码如下所示:

    <?php
    
     session_start();
    
     $_SESSION['user']=$_POST['user'];
    
     $_SESSION['pwd']=$_POST['pwd'];
    
    ?>

    (4)为防止其他用户非法登录本系统,使用if 条件语句对 session变量的值进行判断,这里继续使用了javascript的知识,其代码如下所示:

     if($_SESSION['user']==""){
    
       echo '<script type="text/javascript">alert("请使用正确途径登录"); history.back();</script>';
    
     }

    (5)在数据处理页面 default.php 中添加如下的导航栏代码,判断当前用户的级别,看已登录的用户是管理员还是普通用户,然后区别的输出显示:

    <?php
    
     session_start();
    
     $_SESSION['user']=$_POST['user'];
    
     $_SESSION['pwd']=$_POST['pwd'];
    
     if($_SESSION['user']==""){
    
       echo '<script type="text/javascript">alert("请使用正确途径登录"); history.back();</script>';
    
     }
    
    ?>
    <table align="center" cellpadding="0" cellspacing="0">
    
     <tr align="center" valign="middle">
    
       <td style=" 140px; color: red;">当前用户:
    
         <!-- 输出当前登录用户级别-->
    
         <?php
    
           if($_SESSION['user']=="admin" && $_SESSION['pwd']=="111"){
    
             echo "管理员";
    
           }else{
    
             echo "普通用户";
    
           }
    
         ?>
    
       </td>
    
       <td width="70"><a href="default.php">首页</a><td>
    
       <td width="70">|<a href="default.php">文章</a><td>
    
       <td width="70">|<a href="default.php">相册</a><td>
    
       <td width="100">|<a href="default.php">修改密码</a><td>
    
       <?php
    
         if($_SESSION['user']=="admin" && $_SESSION['pwd']=="111") {   //如果当前用户是管理员
    
          //如果当前用户是管理员 则输出 用户管理
    
          echo   '<td width="100">|<a href="default.php">用户管理</a><td>';
    
         }
    
       ?>
    
       <td width="100">|<a href="safe.php">注销用户</a><td>
    
     </tr>
    
    </table>

    (6)在上面的 default.php 页面中添加 “注销用户”的超链接页面 safe.php,并在 safe.php 中写入如下的代码,进行删除用户 Session,返回登录页面:

    <?php
    session_start();
    unset($_SESSION['user']);
    unset($_SESSION['pwd']);
    session_destroy();
    header('location:index.php');

    (7) 运行这个实例,在网站用户登录页面输入用户名和密码 ,分别以超级用户的身份登录网站或者使用普通用户身份登录网站运行一下。

     

    php自定义Session的信息处理说明

    在系统中使用 Session 技术追踪用户时,Session 默认的处理方式是 Web 服务器中的文件来记录每个用户的会话信息,通过 php.ini 中的 session.save_path 创建会话数据文件的路径。这种默认的处理方式虽然方便,但也是有缺陷的。最主要的原因是本身的 Session 机制不能跨机,因为对于访问量比较大的系统,通常会采用多台服务器进行并发处理,如果每台服务器都单独的处理 Session,就无法达到跟踪用户的目的。这时就需要改变 Session的处理方式,可以将 Session 信息使用共享技术保存到其他服务器中,或是使用数据库来保存 Session 信息。

    无论是用数据库,还是使用共享技术来共享 Session 信息,其中的原理基本是一样的,都是通过 PHP中 的 session_set_save_handler()函数来改变默认的处理方式,指定回调函数来自定义处理。该函数如下所示:

    session_set_save_handler(open, close, read, write, destroy, gc)

    更多信息自己查文档吧,我还没用过

    php中session临时文件和缓存说明

    1. session 临时文件

    在服务器中,如果将所有用户的 session 都保存到临时目录中,会降低服务器的安全性和效率,打开服务器存储的站点会非常慢。在Windows上PHP默认的Session服务端文件存放在C:WINDOWSTemp下,如果说并发访问很大或者 session建立太多,目录下就会存在大量类似sess_xxxxxx的session文件,同一个目录下文件数过多会导致性能下降,并且可能导致受到 攻击最终出现文件系统错误。针对这样的情况,PHP本身体提供了比较好的解决办法。在php中,使用函数 session_save_path() 可以解决这个问题。

    使用php函数 session_save_path() 存储 session 临时文件,可以缓解因临时文件的存储导致服务器效率降低和站点打开缓慢的问题,其实例代码如下所示:

    <?php
    $path = './tmp';
    session_save_path($path);
    session_start();
    $_SESSION['username'] = true;

    注意: session_save_path() 函数应在 session_start()函数之前调用。

    2. session 缓存

    Session缓存的作用

    (1) 减少访问数据库的频率。应用程序从缓存中读取持久化对象的速度显然优于从数据库中检索数据的速度。

    (2) 当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象图的死循环,以及由死循环引发的JVM堆栈溢出。

    (3) 保证数据库中的相关记录与缓存中的记录同步。Session在清理缓存的时,会自动进行脏数据检查(dirty-check),如果发现Session缓存中的对象与数据库中相应记录不一致,则会按最新的对象属性更新数据库。

    session 缓存使用的是 session_cache_limiter()函数,其语法格式如下:

    session_cache_limiter(cache_limiter)

    参数 cache_limiter 为 public 或者 private。 同时 session 缓存 并不是指在服务器端而是在客户端缓存,在服务器中没有显示。

    缓存时间的设置,使用的是 session_cache_expire()函数,其语法格式如下:

    session_cache_expire(new_cache_expire);

    参数cache_expire 是 session 缓存的时间,单位为分钟。

    注意:这两个 session 缓存函数必须在 session_start()函数之前调用,否则会出错。

    下面通过实例了解 session 缓存页面过程,其实现的代码如下所示:

    <?php
    session_cache_limiter('private');
    $cache_limit = session_cache_limiter(); // 开启客户端缓存
    session_cache_expire(30);
    $cache_expire = session_cache_expire(); // 设定客户端缓存时间
    session_start();

    php中session数据库存储实例详解

    虽然通过改变 Session 存储文件夹使 Session 不至于将临时文件夹填满而造成站点瘫痪,但是可以计算一下,如果一个大型网站一天登录 1000 人,一个月登陆了30000人,这时站点中存在 30000 个Session 文件 ,然而要在这 30000 个文件夹中查询一个 session_id 应该不是一件很轻松的事情,这个时候就需要应用到 session 数据库存储, 也就是PHP 中的 session_set_save_handle()函数。

    设计过程

    首先在Mysql数据库创建存储SESSION的表:

    表名为tb_session

    表结构为

    说明:session_key:是用来存会话ID的

    session_data:是用来存经序列化后的$_SESSION[]里的值;

    session_time:是用来存时间戳的,这个时间戳指的是当前session在创建时的 time()+session的有效期。需要注意的是这 里的session_time的类型是int,这样可以在操作数据库时,进行大小比较!

    修改php.ini文件里session_set_save_handler的值,将其修改为user,如图:

     

    index.php用户登录界面

    <?php
    include("session_set_save_handler.php");//引入自定义的会话存储机制
    
    if(isset($_GET["login"])){//判断login是否有值,若有值则要进行注销,
        session_start();//只要需要 用到$_session变量的地方,就需要开启回调函数open
        session_destroy();//这里就是上文提到的 小细节了,当有session_destroy的时候,它是先于read回调函数执行的
    }else{
        session_start();
        if(isset($_SESSION["user"])){//判断此值是否有定义,若有定义则说明 存入的session还未到期,则直接转到主内容
            echo "<script>alert('您不久前刚来过');window.location.href='main.php';</script>";
        }
    }
    ?>
    
    <html>
    <meta charset="utf-8">
    <body>
    <form action="index_ok.php" method="post">
    账    户:<input type="text" name="user"><br>
    密    码:<input type="text" name="pwd">
    <input type="submit" name="sub">
    </form>
    </body>
    </html>

    index_ok.php表单提交处理文件

    <?php
    include("session_set_save_handler.php");
    session_start();
    if($_POST["sub"]){//$_post["sub"]它若有值就是 提交查询
        echo $_POST["sub"];
        if($_POST["user"]!="" && $_POST["pwd"]!=""){
            $_SESSION["user"]=$_POST["user"];
            $_SESSION["pwd"]=$_POST["pwd"];//这里自定义的会话管理机制将会调用回调函数write,将已由序列化处理器处理好的(由$_session[]变量形成)字符串写入数据库
            echo "<script>alert('登录成功!');window.location.href='main.php';</script>";
        }
    }
    
    ?>

    main.php主内容页

    <?php
    include("session_set_save_handler.php");
    session_start();
    
    if(isset($_SESSION["user"])){
        echo "欢迎".$_SESSION["user"];
        echo "<a href='index.php?login=0'>注销</a>";
    }else{
        echo "您还没登录,请先登录!";
        echo "<a href='index.php'>登录</a>";
    }
    
    ?>

    session_set_save_handler.php自定义session存储机制函数文件

    <?php
    
    //打开会话
    function open(){
        //连接mysql数据库
        global $con;
        $con = mysqli_connect('localhost','root','123456','test') or die('数据库连接失败');
        mysqli_query($con,'set names utf8');
        return(true);
    }
    
    //关闭数据库
    function close(){
        global $con;
        mysqli_close($con);
        return(true);
    }
    
    //读取session_data
    function read($key){
        global $con;
        //设定当前时间
        $time = time();
        $sql = "select session_data from tb_session where session_key = '$key' and session_time > $time ";
        $res = mysqli_query($con,$sql) or die('查询失败');
        if(!$res){
            printf("Error:%s
    ",mysqli_error($con));
            exit;
        }
    
        $row = mysqli_fetch_array($res);
        if($row!=false){
            return($row['session_data']);
        }else{
            return "";//一定要返回空值,而不是false
        }
    
    }
    
    //存储session
    function write($key,$data){
        global $con;
        //设定失效时间
        $time = 60*60;//1小时
        //得到unix时间戳
        $lapse_time = time()+$time;
        $sql = "select session_data from tb_session where session_key = '$key' ";
        $res = mysqli_query($con,$sql);
        if(mysqli_num_rows($res) == 0){
            //不存在,创建
            $sql = "insert into tb_session(session_key,session_time,session_data) values ('$key',$lapse_time,'$data')";
            //字符串要加单引号,数字不用
            $res = mysqli_query($con,$sql);
            if(!$res){
                printf("Error:%s
    ",mysqli_error($con));
                exit;
            }
        }else{
            //已存在,更新
            $sql = "update tb_session set session_key = '$key' ,session_data = '$data' ,session_time = $lapse_time where session_key = '$key' ";
            $res = mysqli_query($con,$sql);
        }
        return($res);
    }
    
    //清除session数据
    function destroy($key){
        global $con;
        //删除session
        $sql = "delete from tb_session where session_key = '$key' ";
        $res = mysqli_query($con,$sql);
        return($res);
    }
    
    //垃圾回收
    function overdue($expire_time){//这个参数是自动传进去的,就是session.gc_maxlifetime最大有效时间,例如1440s;
        global $con;
        $lapse_time = time();
        $sql = "delete from tb_session where session_time < $lapse_time ";//清除过期session
        $res = mysqli_query($con,$sql);
        return($res);
    }
    
    session_set_save_handler('open','close', 'read', 'write','destroy', 'overdue');

    数据库如下:

    php中session时间设置详解

    1. 客户端没有禁止Cookie

    (1)使用session_set_cookie_params()设置 Session失效时间,此函数是 Session 结合 Cookie设置失效时间。如果要让 Session 在一分钟后失效,其代码示例如下所示:

    <?php
    
    $time = 1*60;
    session_set_cookie_params($time);
    session_start();
    $_SESSION['username'] = 'cyy';

    注意: session_set_cookie_params() 必须要在 session_start()之前调用。

    说明:不推荐使用此函数,此函数在一些浏览器上会出现问题。 所以一般会用手动设置失效时间。

    (2)使用 setcookie()函数可对 Session 设置失效时间,要让 Session 在一分钟后失效,其代码示例如下所示:

    <?php
    
    session_start();
    $time = 1*60;
    setcookie(session_name(),session_id(),time()+$time.'/');
    $_SESSION['username'] = 'cyy';

    说明: 在上例代码 setcookie()函数中,session_name 是 Session的名称, session_id 是判断客户端用户的标识,因为 session_id 是随机产生的唯一名称, 所以Session 是相对安全的。失效时间和 Cookie 的失效时间一样,最后一个参数为可选参数,是放置 Cookie 的路径。

    2. 客户端禁止Cookie

    (1)在登陆之前提醒用户必须打开 Cookie,这是很多论坛的做法。

    (2)设置php.ini 文件中的 session.use_trans_sid =1,或者编译时打开 -enable-trans-sid 选项,让PHP自动跨页面传递 session_id。

    (3)通过 GET方法,隐藏表单传递 session_id。

    (4)使用文件或者数据库存储 session_id,在页面间传递中手动调用。

    以上第2种方法不做详细的介绍,因为用户不能修改服务器中的php.ini文件。第3中方法我们就不可以使用 Cookie 设置失效时间,但是登录情况没有变化。 第4种也是最为重要的一种,在开发企业级网站时,如果遇到session文件 使服务器速度变慢,就可以使用。这里我们介绍一下第3种方法使用 GET 方法传输,其示例代码如下所示,接收页面头部的代码:

    <?php
    
    $session_name = session_name();
    $session_id = $_GET[$session_name];
    session_id($session_id);
    session_start();
    $_SESSION['username'] = 'cyy';

    说明: Session 为请求该页面之后会产生一个 session_id ,如果这时禁止了 Cookie 就无法传递 session_id,在请求下一个页面是将会重新产生一个 session_id ,这样就造成了 session 在页面间传递失效。

  • 相关阅读:
    (C/C++)区别:数组与指针,指针与引用
    C++中数组名和指针的区别联系
    C++引用的用处
    C++编写DLL动态链接库的步骤与实现方法
    C++_编写动态链接库
    C++ 模板
    C++ 信号处理
    C++ 多线程
    js事件冒泡
    js事件委托
  • 原文地址:https://www.cnblogs.com/chenyingying0/p/12966731.html
Copyright © 2011-2022 走看看