sessionid是存储在cookie中的,解决方案如下:

Session URL重写,保证在客户端禁用或不支持COOKIE时,仍然可以使用Session

session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当 程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。 保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于 SEEESIONID。

关于PHP中浏览器禁止Cookie后,Session能使用吗?我们来做些测试,然后说明原理。

我建立两个文件session_test.php和session_a.php内容分别是:
<?php
session_start();
$_SESSION['url'] = 'http://www.phpddt.com';
echo '这个页面取到的session值:'.$_SESSION['url'];
echo "<a href='session_a.php'>另一个页面</a>";

<?php
session_start();
echo "看这里是否获取到session的值:".$_SESSION['url'];

运行session_test.php结果:

点击另一个页面,默认当然是可以获取的,但是当我禁止cookie后呢?
看看session_a.php结果:

可以看到禁用之后是不能使用cookie的。

解决方法一:URL重写

PHP中的session在默认情况下是使用客户端的Cookie来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。但是Session并不完全依赖Cookie,它还可以通过URL Get自动传递session id的。这需要你设置php.ini中的session.use_trans_sid = 1或者编译时打开了--enable-trans-sid选项,让PHP自动跨页传递session id。当session.use_trans_sid为有效时,session.use_only_cookies一定要设置为无效0
好,这样,把上面session_test.php和session_a.php改造下就可以使用sesson了:

//session_test.php

<?php
session_start();
$_SESSION['url'] = 'http://www.phpddt.com';
echo '这个页面取到的session值:'.$_SESSION['url'];
?>
<a href="session_a.php">另一个页面</a>
//session_a.php

<?php
//session_a.php
session_start();
echo "看这里是否获取到session的值:".$_SESSION['url'];

?>
<a href="session_b.php">另一个页面b</a>
//解决方法二:手动传递url
<?php
session_start();
$_SESSION['url'] = 'http://www.phpddt.com';
echo '这个页面取到的session值:'.$_SESSION['url'];
?>
<a href="session_a.php?<?php print session_name() ?>=<?php print session_id() ?>">另一个页面</a>

<?php
session_id($_GET['PHPSESSID']);
session_start();
echo "看这里是否获取到session的值:".$_SESSION['url'];

//解决方法三:隐藏表单的方法基本原理同上。

途径3举例说明:login.html

按 Ctrl+C 复制代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
请登录:
<form name="login" method="post" action="mylogin1.php">
用户名:<input type="text" name="name"><br>
口 令:<input type="password" name="pass"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
按 Ctrl+C 复制代码
mylogin1.php

按 Ctrl+C 复制代码
<?php
$name=$_POST[’name’];
$pass=$_POST[’pass’];
if(!$name || !$pass) {
echo "用户名或密码为空,请<a href="login.html">重新登录</a>";
die();
}
if (!($name=="youngong" && $pass=="123") {
echo "用户名或密码不正确,请<a href="login.html">重新登录</a>";
die();
}
//注册用户
ob_start();
session_start();
$_SESSION[’user’]= $name;
$psid=session_id();
$fp=fopen("e:\tmp\phpsid.txt","w+";
fwrite($fp,$psid);
fclose($fp);
//身份验证成功,进行相关操作
echo "已登录<br>";
echo "<a href="mylogin2.php">下一页</a>";
?>
按 Ctrl+C 复制代码
mylogin2.php

按 Ctrl+C 复制代码
<?php
$fp=fopen("e:\tmp\phpsid.txt","r";
$sid=fread($fp,1024);
fclose($fp);
session_id($sid);
session_start();
if(isset($_SESSION[’user’]) && $_SESSION[’user’]="laogong" {
echo "已登录!";
}
else {
//成功登录进行相关操作
echo "未登录,无权访问";
echo "请<a href="login.html">登录</a>后浏览";
die();
}
?>
按 Ctrl+C 复制代码
请关闭cookie再测试,用户名:youngong 密码:123 这是通过文件保存session id的,文件是:e:\tmp\phpsid.txt。至于用数据库的方法,就不举例子了,与文件的操作方法类似。以上方法有一个共同点,就是在前一页取得session id,想办法传递到下一页,在下一页的session_start();之前加代码session_id(传过来的session id);用关系数据库或内存数据库redis以及文本存储session时需要建立用户id和其sessionid的一个映射关闭,应对多用户时调用不同的session文件。希望能为您提供一些参考。
---------------------
作者:禾斗比不来IT
来源:CSDN
原文:https://blog.csdn.net/river131/article/details/51701905
版权声明:本文为博主原创文章,转载请附上博文链接!

关于PHP中浏览器禁止Cookie后,Session能使用吗?的更多相关文章

  1. php在浏览器禁止cookie后,仍然能使用session的方法

    1.a.php页面 session_start(); $_SESSION['msg'] = "i love you"; $sn = session_id();//获取当前sessi ...

  2. 禁止COOKIE后对SESSION的影响

    一.理解SESSION机制 简单来说:每一个SESSION都有一个唯一的session_id , 默认情况下,session_id存储在客户端(默认COOKIE['PHPSESSID']), 在使用S ...

  3. 浏览器禁用cookie后php如何保持session会话-use_trans_sid机制

    原文:浏览器禁用cookie后php如何保持session会话-use_trans_sid机制 为防止浏览器禁用cookie导致服务器会话无法保持,php开发了一个机制,该机制开启后,浏览器发起请求后 ...

  4. 禁用cookie后session是如何设置的

    我们都知道当在session 会话有基于cookie和基于url两种传递SESSIONID的方法.为了实现客户端禁止cookie发送的情况也不影响客户登陆网站,可以设置 php.ini中 sessio ...

  5. session机制,浏览器禁用cookie后,怎么使用session

    sessionid是存储在cookie中的,解决方案如下: Session URL重写,保证在客户端禁用或不支持COOKIE时,仍然可以使用Session session机制.session机制是一种 ...

  6. 用户禁止cookie后,如何继续使用session

    (1)如果用户禁止cookie,服务器仍会将sessionId以cookie的方式发送给浏览器,但是,浏览器不再保存这个cookie(即sessionId)了. (2)如果想继续使用session,需 ...

  7. Asp.net 中ViewState,cookie,session,application,cache的比较

    Asp.net 中的状态管理维护包含ViewState,cookie,session,application,cache五种方式,以下是它们的一些比较: 1.存在于客户端还是服务端 客户端: view ...

  8. php 会话控制(禁用cookie后session为什么会失效?)

    首先说明一点:session不一定必须依赖cookie,只是php默认客户端sessionid基于cookie方式保存. 到此,我想你也应该了解了php默认的session客户端保存方式是基于cook ...

  9. ASP.NET Core2.1 中如何使用 Cookie和Session

    https://blog.csdn.net/canduecho/article/details/80651853 ASP.NET Core2.1的官方项目模板在创建的Razor Pages和MVC项目 ...

随机推荐

  1. Linux中rm命令详解

    linux下rm命令使用详解---linux删除文件或目录命令 用户可以用rm命令删除不需要的文件.该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除 ...

  2. LINQ 小项目【组合查询、分页】

    使用 linq 在网页上对用户信息增删改,组合查询,分页显示 using System; using System.Collections.Generic; using System.Linq; us ...

  3. js 对url进行编码和解码的三种方式

    一.escape 和 unescape escape 原理:对除 ASCII字母.数字.标点符号(@ * _ + - . /) 以外的字符进行编码 .编码的字符被替换成了十六进制的转义序列 不编码的字 ...

  4. 【Java并发编程】20、DelayQueue实现订单的定时取消

    当订单定时取消需要修改数据库订单状态,但是怎么确定订单什么时候应该改变状态,解决方案有下面两种: 第一种,写个定时器去每分钟扫描数据库,这样更新及时,但是如果数据库数据量大的话,会对数据库造成很大的压 ...

  5. java基础-配置java的环境变量

    学习java之前首先在https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html上面下载与 ...

  6. Java - 线程池设计与选择

    http://ifeve.com/how-to-calculate-threadpool-size/ 任务一般可分为:CPU密集型.IO密集型.混合型,对于不同类型的任务需要分配不同大小的线程池. C ...

  7. API接口规范V1.0——制定好规范,才好合作开发

    返回码规范: 统一六位 000000 表示成功! 参数相关返回码预留100000-199999:系统相关返回码预留200000-299999:数据中心310000-319999后续项目以此类推,后续根 ...

  8. HotSpot 虚拟机对象揭秘【转载】

    对象的创建 Java 对象的创建过程, ①类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过.解 ...

  9. JavaScript--fullPage.js插件

    GitHub:https://github.com/alvarotrigo/fullPage.js FullPage.js是一个基于JQuery的插件,可以很方便的制作出全屏网站; 一 特点: 1.支 ...

  10. react组件中的constructor和super小知识

    react组件中的constructor和super小知识 1.react中用class申明的类一些小知识 如上图:类Child是通过class关键字申明,并且继承于类React. A.Child的类 ...