• PHP面试 PHP基础知识 八(会话控制)


    ---恢复内容开始---

    PHP会话控制技术

      首先了解一下为什么要使用会话控制技术?

      本身web 与服务器的交互是通过HTTP协议来实现的,而HTTP协议又是无状态协议。就是说明HTTP协议没有一个內建机制来维护web与服务器之间的状态。所以同一个用户请求同一个页面两次的时候,HTTP协议不会认为这两次请求来自同一个web,会把这两次请求隔离开。会认为是两个不同的用户来请求的。如果这个用户执行了登陆操作,再次请求页面。HTTP协议不会认为该用户做过登陆操作。因为HTTP协议无法保留登陆状态,无法在不同页面之间进行跟踪和状态保持。会话控制就是保留用户的状态,用来跟踪和对用户的状态保持。

      cookie和session

      cookie是一种由服务器发给客户端的片段信息,存储在客户端浏览器的内存或者硬盘当中的技术。

      就是存储在浏览器当中的一个文件

      cookie的优点和缺点

      优点:cookie存储在客户端,不会占用服务器端的资源。

      缺点:也是存储在客户端,不建议将一些敏感重要的数据保存到cookie当中。而且用户有权限在浏览器禁止cookie的使用,一旦用户禁止cookie无法保存用户信息。

      cookie的不可跨域名性

      不可跨域名性是什么意思呢?目前很多网站都会使用cookie,比如客户端说访问A网站,A网站会给客户端颁发一个cookie。客户端访问B网站,B网站也会给客户端颁发一个cookie。那么客户端访问B网站会不会带着A网站的cookie?B网站可不可以修改A网站颁发给客户端的cookie呢?

      答案肯定是不可以的。cookie具有不可跨域名性,根据cookie的规范,客户端访问B网站只会携带B网站颁发的cookie,从而B网站只能操作B网站颁发的cookie,不能修改A网站的cookie。

      cookie是客户端浏览器来管理的,浏览器能保证B只操作B不会操作A,从而保证用户的隐私安全。

      浏览器又是怎么管理的呢?

      浏览器判断一个网站能否操作另一个网站的cookie是根据域名,A网站和B网站的域名不同,所以B不能修改A的cookie。

    cookie的操作
    
    存储cookie
    setcookie(name,value,expire,path,domain,secure)
    参数
        name     键名
        value     存储的cookie值
        expire    cookie过期时间
        path       规定的cookie服务器路径
        domain   规定cookie的域名
        secure    是否通过HTTP传输cookie
    
    读取cookie
    
    $_COOKIE
    
    删除cookie
    
    setcookie(name,'',time()-1000);

      session是存在服务器的一种用来存放用户数据的类hashtable结构。

      当浏览器向服务器发送第一次请求的时候。服务器会生成一个hashtable和一个sessionid,sessionid用来标识hashtable,服务器返回浏览器的时候会把sessionid一起返回。第二次浏览器请求的时候会携带第一次的sessionid,服务器根据sessionid来查找相匹配的hashtable.

      session的优点和缺点

      优点:安全性高      缺点:占用服务器资源。

      推荐一个详解cookie和session的博客:https://www.cnblogs.com/yaowen/p/4819018.html

    使用session   首先开启session
    
    session_start()
    
    操作session
    
    $_SESSION;   这里不详细介绍    可以参考百度
    
    清除session
    
    $_SESSION = [];
    
    session_distory();   删除session文件并把sessionid删除
    
    session相关配置
    
    session.auto_start   session是否自动开启
    session.cookie_domain   session的有效域名
    session.cookie_lifetime   session存储在cookie的最大生命周期
    session.cookie_path     session存储在cookie的路径
    session.name    cookie存储sessionid的键名
    session.save_path  session存储在服务器的路径
    session.use_cookies 是否使用cookie传递sessionid
    session.use_trans_id  是否可以使用连接传递sessionid
    
    session垃圾回收机制
    session.gc_probability    清理次数
    session.gc_divisor          请求次数
    session.gc_maxlifetime   最大生命周期  超过生命周期 视为垃圾
    
    到达访问次数  就会清理一次垃圾
    
    session.save_handle   session存储方式   如:mysql  redis  memcache
      cookie 和session的区别

      1、cookie保存在客户端,服务器可以知道其中的信息。session存储在服务器端,客户端不知道其中的信息。

      2、session保存的是对象,cookie保存的是字符串。

      3、session不能区分路径,在同一个网站下在所有地方都可以访问到session,如果cookie设置了路径,那么同一个网站下不同路径的cookie互相是不能访问的。

      cookie与session的联系

      session是依赖于cookie才能正常工作,如果用户在客户端禁用了cookie那么session也将失效。

      为什么cookie禁用session也失效?

      因为session在客户端也需要保存一个唯一标识(就是sessionid),那么就需要用到cookie,sessionid是存在cookie当中的,使用$_COOKIE['PHPSESSID']可以获取sessionid,所以禁掉cookie,session也不能使用。

      禁用cookie后如何传递sessionid值?

      1、可以修改配置

        session.use_cookies = 0;设置客户端不用cookie保存sessionid值

        session.use_only_cookies = 1;  是否只使用cookie传递sessionid

        session.use_trans_sid = 1;  url自动加上PHPSESSID  这样session正常使用

      2、使用url传递sessionid 

        <a href="indx.php?<?php echo session_name(). '=' .session_id();?>"></a>

        SID常量在禁用cookie的时候就是session_name和session_id的拼接,否则就是null

        <a href="indx.php?<?php echo SID;?>"></a>

  • 相关阅读:
    彻底理解jdbc为什么用反射创建驱动程序对象
    java反射
    hashcode(),equal()方法深入解析
    面试经验总结
    Spring安全权限管理(Spring Security)
    http认证方式
    ubuntu/linux mint 创建proc文件的三种方法(两)
    cocos2dx使用tolua关于字符串处理的一个问题
    Ubuntu——grub rescue 主引导修复
    BCM wifi分析
  • 原文地址:https://www.cnblogs.com/dcrq/p/11053926.html
Copyright © 2020-2023  润新知