zoukankan      html  css  js  c++  java
  • 实例直观解释sessionid的作用

    有两个php页面,demo1.php与demo2.php。如果想要在demo1.php创建一个session需要在的demo2.php或者说其它页面都可以获取到设置的session的值,达到会话的功能,有几种实现方式?

    一、未屏蔽浏览器cookie

    demo1.php代码:

    <?php
    session_start();
    $sid = session_id();
    echo "sessionid:".$sid."<br/>";
    $_SESSION['user'] = '巴八灵';
    $a = $_SESSION['user'];
    echo "session的值:".$a.PHP_EOL."<br/>";
    

    结果如下:

    demo2.php

    <?php
    session_start();
    $sid = session_id();
    echo "sessionid:".$sid."<br/>";
    echo "session的值:".$_SESSION['user'];
    

    结果如下:

    查看php.ini配置我们这里设置session存储是在服务器/tmp目录下

    通过查看发现session的存储都是以sessionid加上一串字符构成的文件,我们设置的session的值就存储在这样的文件当中。我们发现设置的session之所以能够在两个页面中共享获取,是因为都共同拥有一个sessionid,并且这个sessionid以cookie形式存储在浏览器,然后通过http请求中的header头的cookie项传递给服务器。那如果将浏览器cookie禁用后将会发生什么效果呢?下面的部分就将阐述浏览器禁用cookie后的影响和解决方法的实现。
    

    二、屏蔽浏览器cookie后

    我这边使用的是google浏览器,进入google浏览器设置选项-内容设置-cookie-屏蔽cookie选项,如下图:

    发现程序报错,sessionid每次刷新都会不一样,但是session的设置不会受影响,值还是还是可以存储到服务器中,但是与其它页面session不共享。

    方法一:通过url显现传递sessionid实现session共享

    demo1.php

    <?php
    session_start();
    $sid = session_id();
    echo "sessionid:".$sid."<br/>";
    $_SESSION['user'] = '巴八灵';
    $a = $_SESSION['user'];
    echo "session的值:".$a."<br/>"; 
    echo "<a href='./demo2.php?sid=".$sid."' target='_blank' >demo2.php</a>";
    
    

    demo2.php

    
    <?php
    $sid = $_GET['sid'];
    session_id($sid);
    session_start();
    $sid = session_id();
    echo "sessionid:".$sid."<br/>";
    echo "session的值:".$_SESSION['user'];
    
    
    方法二:修改php.ini配置隐式通过get参数sessionid
    session.use_trans_sid = 1
    session.use_cookies = 1
    session.use_only_cookies = 0
    

    修改参数数重启php-fpm

    demo1.php

    
    <?php
    session_start();
    $sid = session_id();
    echo "sessionid:".$sid."<br/>";
    $_SESSION['user'] = '巴八灵';
    $a = $_SESSION['user'];
    echo "session的值:".$a."<br/>"; 
    echo "<a href='./demo2.php‘ target='_blank' >demo2.php</a>";
    
    

    demo2.php

    <?php
    session_start();
    $sid = session_id();
    echo "sessionid:".$sid."<br/>";
    echo "session的值:".$_SESSION['user'];
    
    

    仔细可以发现屏蔽浏览器cookie后,浏览器中header头没有传递cookie项,这个时候sessionid不能够都过header头的方式传递,服务器肯定不知道sessionid的是什么,于是可以通过url中传递sessionid来让服务器知道这个是什么,从而去取session的设置信息。换言之就是sessionid是获取session配置信息的一个桥梁,cookie在其中起到的是传递sessionid的作用,我们屏蔽cookie后,让session可以共享的解决方法也是将sessionid告诉给服务器来解决问题。
    

    由此我们可以得出实现sessionid会话的三种方式为:

    1.浏览器cookie没有屏蔽,通过php生成session时,php会自动的将此刻的sessionid在http的header上以cookie项传递给服务器进行校验后并获取session的设置值

    2.屏蔽浏览器cookie后,php设置session时产生的sessionid可以通过get方式将这个参数传递给需要访问的其它页面,在新的页面中接收sessionid的值,并通过session_id($_GET['sid'])这个方法讲sesionid给出去从而获取设置的session值

    3.通过配置php.ini中session.use_trans_sid = 1来实现隐式传递sessionid,设置session的页面跳转也不需要带上参数,系统会默认带上,跳转后的页面也不需要接收参数,都是在内部解决的,从而也可以获取到设置的session的值

  • 相关阅读:
    【设计模式】适配器模式
    【设计模式】原型模式
    【设计模式】建造者模式
    【设计模式】抽象工厂模式
    我的稳定的SpingBoot项目依赖
    Vue中使用iconfont
    Vue-兄弟组件传值
    CSS让高度百分百的方案
    css修改overflow滚动条默认样式
    CSS去除input和textarea点击选中框
  • 原文地址:https://www.cnblogs.com/lisqiong/p/10172780.html
Copyright © 2011-2022 走看看