有两个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的值

实例直观解释sessionid的作用的更多相关文章

  1. 免费的HTML5连载来了《HTML5网页开发实例具体解释》连载(六)媒体查询

    响应式设计的还有一个重要技术手段是媒体查询.假设仅仅是简单的设计一个流式布局系统,那么能够保证每一个网格按比例的放大和缩小,但有可能会使得在小屏幕下(如手机设备)网格太小而严重影响阅读,这种设计称不上 ...

  2. 感谢各位亲们的大力支持,免费的HTML5学习课程《HTML5网页开发实例具体解释》连载已经结束了!

    感谢各位亲们的大力支持,免费的HTML5学习课程<HTML5网页开发实例具体解释>连载已经结束了.  有兴趣的读者能够看我的博客,也能够看以下的链接逐个学习: 当里个当.免费的HTML5连 ...

  3. 《HTML 5网页开发实例具体解释》样章、内容简单介绍、前言

    http://spu.jd.com/1167757597.html http://product.dangdang.com/23484942.html 样章 http://download.csdn. ...

  4. Linux守护进程简单介绍和实例具体解释

    Linux守护进程简单介绍和实例具体解释 简单介绍 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程. ...

  5. 算法基础:BFS和DFS的直观解释

    算法基础:BFS和DFS的直观解释 https://cuijiahua.com/blog/2018/01/alogrithm_10.html 一.前言 我们首次接触 BFS 和 DFS 时,应该是在数 ...

  6. Swift难点-继承中的构造规则实例具体解释

    关于继承中的构造规则是一个难点. 假设有问题,请留言问我. 我的Swift新手教程专栏 http://blog.csdn.net/column/details/swfitexperience.html ...

  7. Oracle之Check约束实例具体解释

    Oracle | PL/SQL Check约束使用方法具体解释 1. 目标 实例解说在Oracle中怎样使用CHECK约束(创建.启用.禁用和删除) 2. 什么是Check约束? CHECK约束指在表 ...

  8. boost asio异步读写网络聊天程序client 实例具体解释

    boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...

  9. PCA 最大方差理论的直观解释

    PCA 这个名字看起来比较玄乎,其实就是给数据换一个坐标系,然后非常生硬地去掉一些方差很小的坐标轴. 例:三维空间中,有一些数据只分布在一个平面上,我们通过"坐标系旋转变换",使得 ...

随机推荐

  1. httpclient 多线程请求

    线程请求执行 当配备一个线程池管理器后,如PollingClientConnectionManager,HttpClient就能使用执行着的多线程去执行并行的多请求. PollingClientCon ...

  2. 判断 Windows操作系统是32位还是64位

    function IsWin64: Boolean; var Kernel32Handle: THandle; IsWow64Process: function(Handle: Windows.THa ...

  3. js常用用途

     页面元素查找 查找元素方法表达式                                                 返回值                            依据元 ...

  4. beta阶段贡献分配实施

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2281] 要求1 每位组员的贡献分值   刘莹莹 王玉潘 潘世维 周昊 赵美增 ...

  5. 2018-2019-2 网络对抗技术 20165202 Exp1 PC平台逆向破解

    一.基础知识 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码. NOP指令为空指令,当运行该指令时CPU不做任何事情,但是会占用一个指令的时间,当指令间需要有延时,可以插入NOP指令 ...

  6. 子域名爆破&C段查询&调用Bing查询同IP网站

    在线子域名爆破 <?php function domainfuzz($domain) { $ip = gethostbyname($domain); preg_match("/\d+\ ...

  7. Android下打印堆栈的两种方法

    1. for(StackTraceElement i:Thread.currentThread().getStackTrace()){ System.out.println(i); } 2. Log. ...

  8. HTTP Header之Content-Type

    HTTP Header之Content-Type   目录 1. HTTP Header 2. 文件请求和接口请求 3. 几种 Content-Type 3.1 application/x-www-f ...

  9. Hadoop streaming使用自定义python版本和第三方库

    在使用Hadoop的过程中,遇到了自带python版本比较老的问题. 下面以python3.7为例,演示如何在hadoop上使用自定义的python版本以及第三方库. 1.在https://www.p ...

  10. 1.2 Linux中的进程 --- fork、vfork、exec函数族、进程退出方式、守护进程等分析

    fork和vfork分析: 在fork还没有实现copy on write之前,Unix设计者很关心fork之后立即执行exec所造成的地址空间浪费,也就是拷贝进程地址空间时的效率问题,所以引入vfo ...