session上踩的坑

作者: 谦业 | 来源:发表于2020-01-02 18:48 被阅读0次

    session与cookie的简单区别

    session和cookie本质上确实是两个东西,但cookie同时也是session id的载体,cookie保存session id。

    1. cookie数据存放在客户的浏览器上,session数据放在服务器上。

    session保存在服务器端与浏览器设置无关,cookie在客户端并受浏览器设置限制。
    cookie是在你的电脑上保存的,session是在服务器上的. 也就是说你换一个电脑你的cookie就不起作用了, 而session只要你的浏览器不关就还能访问到. 通常的都是两者结合着用的. cookie的话你自己就可以通过对浏览器的设置禁用掉.这样就不起作用了

    1. cookie不是很安全

    别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
    session是服务器端缓存,cookie是客户端缓存。
    cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案

    1. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

    session是服务器保持客户端状态信息的方案,一般是保存在服务器中的一块内存中,session超时时间在服务器端进行设置。
    cookie是客户端保持用户信息的方案,一般是文件形式保存,cookie清空时间是在客户端浏览器设置。
    从开发角度说,session信息可以通过技术方案写到客户端保存,cookie中的用户信息,也可以在用户访问该网站时,通过技术手段自动更新用户的session信息。

    1. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

    建议:将登陆信息等重要信息存放为session;其他信息如果需要保留,可以放在cookie中


    确保开启session功能

    开启session功能是很重要的,比如下面一个场景:某个网站程序在测试服务器上调试,首页是ok的,但一到后台去登录就登录不进去,起初怀疑是rewrite规则没有写对,后排查就是因为session功能没有打开引起的!

    那么session应该如何开启?

    1. 编辑php.ini配置文件
    
    session.save_path=文件夹路径      
    
    ;指向任意一个有写权限的目录就行了.
    
    register_globals = On           
    
    ;打开全局变量,如果不打开,你就这样用$_SESSION['sessioname'];但是我本人从来没成功过.
    
    2. 重启php服务即可(如果是lamp模式,就重启apache)
    

    看一个linux下Session丢失的案例分析

    由于各种原因需要进行代码迁移,迁移后重新搭建php环境,运行代码。最后在登录页面时发现后台不能访问,会直接返回到登录页面,接着对代码进行测试,没有报任何错误,最后排查是因为跳转时session丢失造成的!那么session如何会丢失呢?

    发现造成这个原因有这几种:

    • session存储路径(目录)不存在,自然就无法生成session临时文件
    • session存储路径下有没有权限,如果没有,也就不可能存储session数据
    • 能正常存session数据,但session存入后被清空

    尝试解决的措施:

    • 在项目根目录下创建phpinfo.php文件,在文件中写入phpinfo(),运行此文件,查看页面,就可以找到session的存储路径==session_save_path==,
    • 在服务器上查找session存储路径是否存在,不存在创建存储目录,并分配权限,如果有session存储路径,就查看其是否有权限,没有就分配权限,
    • 是否是第三个原因,可在phpinfo.php页面中查找==date.timezone==是否设置不对,然后在php.ini配置文件中找到date.timezone进行配置

    需要清楚知道的:

    1. 在php.ini文件里将session.save_handler修改为memcached,即表示将php的session信息存放到memcache里(前提是安装memcached扩展),然后在session.save_path处配置连接memcache信息。如:
    session.save_handler = memcached
    session.save_path = "memcache1.huanqiu.com:11311,memcache1.huanqiu.com:11312,memcache2.huanqiu.com:11311,memcache2.huanqiu.com:11312"
    
    注意:

    带d的memcached扩展,则session.save_path配置连接的时候不需要加tcp://
    如果是不带d的memcache扩展,则session.save_path配置连接的时候需要加tcp://

    1. 如果将session.save_handler修改为redis,即表示将php的session信息存放到redis里(前提是安装了php的phpredis扩展),然后在session.save_path处配置redis的connect 地址。如下:
    session.save_handler = redis
    session.save_path = "tcp://127.0.0.1:6379"
    

    原文

    相关文章

      网友评论

        本文标题:session上踩的坑

        本文链接:https://www.haomeiwen.com/subject/azwooctx.html