关于PHP中浏览器禁止Cookie后,Session能使用吗?
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能使用吗?的更多相关文章
- php在浏览器禁止cookie后,仍然能使用session的方法
1.a.php页面 session_start(); $_SESSION['msg'] = "i love you"; $sn = session_id();//获取当前sessi ...
- 禁止COOKIE后对SESSION的影响
一.理解SESSION机制 简单来说:每一个SESSION都有一个唯一的session_id , 默认情况下,session_id存储在客户端(默认COOKIE['PHPSESSID']), 在使用S ...
- 浏览器禁用cookie后php如何保持session会话-use_trans_sid机制
原文:浏览器禁用cookie后php如何保持session会话-use_trans_sid机制 为防止浏览器禁用cookie导致服务器会话无法保持,php开发了一个机制,该机制开启后,浏览器发起请求后 ...
- 禁用cookie后session是如何设置的
我们都知道当在session 会话有基于cookie和基于url两种传递SESSIONID的方法.为了实现客户端禁止cookie发送的情况也不影响客户登陆网站,可以设置 php.ini中 sessio ...
- session机制,浏览器禁用cookie后,怎么使用session
sessionid是存储在cookie中的,解决方案如下: Session URL重写,保证在客户端禁用或不支持COOKIE时,仍然可以使用Session session机制.session机制是一种 ...
- 用户禁止cookie后,如何继续使用session
(1)如果用户禁止cookie,服务器仍会将sessionId以cookie的方式发送给浏览器,但是,浏览器不再保存这个cookie(即sessionId)了. (2)如果想继续使用session,需 ...
- Asp.net 中ViewState,cookie,session,application,cache的比较
Asp.net 中的状态管理维护包含ViewState,cookie,session,application,cache五种方式,以下是它们的一些比较: 1.存在于客户端还是服务端 客户端: view ...
- php 会话控制(禁用cookie后session为什么会失效?)
首先说明一点:session不一定必须依赖cookie,只是php默认客户端sessionid基于cookie方式保存. 到此,我想你也应该了解了php默认的session客户端保存方式是基于cook ...
- ASP.NET Core2.1 中如何使用 Cookie和Session
https://blog.csdn.net/canduecho/article/details/80651853 ASP.NET Core2.1的官方项目模板在创建的Razor Pages和MVC项目 ...
随机推荐
- 使用C#编写自己的代码生成器,附代码讲解(一)
使用过代码生成器的开发人员应该知道,通过代码生成器生成项目的代码,可以大大的减少重复编码的时间,提供项目开发的效率,将自己从繁杂重复的代码中解放出来.现在网络上也有很多的开源的代码生成器或者使用比较广 ...
- Java中的集合迭代器
集合的迭代器 任何集合都有迭代器. 任何集合类,都必须能以某种方式存取元素,否则这个集合容器就没有任何意义. 迭代器,也是一种模式(也叫迭代器模式).在java中它是一个对象,其目的是遍历并选中其中的 ...
- hash table (youtube 2)
https://www.youtube.com/watch?v=jEdaduyLLqY
- APP如何进行通信的
什么是B/S架构(Browser/server):浏览器和服务器架构
- MySQL chartset
-- # https://dev.mysql.com/doc/refman/8.0/en/charset-database.html -- create database aixinyz; -- 默認 ...
- The open source JavaScript graphing library that powers Plotly
https://plot.ly/javascript/time-series/ https://plot.ly/javascript/ https://github.com/plotly/plotly ...
- 【20190123】JavaScript-轮播图特效中出现的问题
使用纯html和JavaScript实现焦点轮播图特效,本来之前用setInterval()函数写的一个简单的循环轮播图,但是出现了两个问题: 1. 当网页被切换时,也就是网页失去焦点时,计时器函 ...
- Tomcat 8默认工具manager管理页面访问配置
Tomcat 8默认工具manager管理页面访问配置 1. 分配相关的角色权限 需要配置的配置文件是${catalina.home}/conf/tomcat-users.xml先给Tomcat访问相 ...
- Handler消息处理机制详解
之前一直只知道handler如何使用,不知道其中的工作原理,趁着新版本提测阶段比较空闲,及时做一个总结. 先看一下Google官方文档关于handler的解释: A Handler allows yo ...
- Android View体系(三)属性动画
上一篇文章讲了View滑动的六种方法,其中一种是使用动画,这篇文章我们来讲一讲动画的其中一种:属性动画. 1.android视图动画和属性动画 视图动画我们都了解,它提供了AlphaAnimation ...