记得刚开始接触web开发的时候就遇到这类的问题关于Session和Cookie的一些争论。两者都是用来暂存数据的,这里就不说Session和Cookie的区别了,一般情况下Session需要Cookie的支持,但是有时候客户端安全设置高了那么Cookie就会被禁用(虽然到现在我还没有在实际开发中遇到过)但是这种情况是确实会存在的。下面我们来说下在Cookie禁用了以后Session怎么用,(注意:在一个脚本是可以用的 关键同一服务器不同脚本的访问)
首先Session依赖Cookie的地方在于Cookie记录下一个唯一的标识 sessionid,服务器端默认的会读取客户端的cookie中的sessionid如果没有的情况下那么session就会丢失,那么关键点就在于sessionid的获取上。
其次如果只有sessionid那么也是无法获取或者解析session中的这个id的数据那么这个问题就是session的存储问题,如果禁用了cookie那么session的存储就要我们特别处理不管是存到数据库还是文件中,需要单独存储,这里因为为了脚本的简单就用sessionid 作为文件名存储session的数据
今天写了一个小脚本用来测试,
第一步:这一步是我在做测试中突然想到的如果客户端禁用了Javascript这里必须支持Javascript所以要验证下
-
-
- 客户端Javascript/Cookie/Session 检测
- "UTF-8"/>
-
-
-
-
"phpZF_check_javascript_enable">您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascript
-
-
如果客户端不支持Javascript那么就会有文本提示让用户开启
第二步:检测是否支持Cookie
关键函数
- phpZF.checkCookieEnable = function(){
- var cookie_enable = false;
- if(navigator.cookiesEnabled)
- return true;
- document.cookie = "checkCookie=yes";
- var cookieSet = document.cookie;
- if(cookieSet.indexOf("checkCookie=yes") > -1)
- cookie_enable = true;
- document.cookie = "";
- return cookie_enable;
- }
如果开启那么很好我们正常流程走
假如不开启,那么我会在浏览器载入完成后的时候重新载入,不过这次载入我会在原来的url后面加上一个浏览器不支持cookie的参数
PHP接收后就会特别处理session
关键函数
Javascript
- phpZF.unableCookieShareSession = function() {
- alert('对不起,您的浏览器Cookie功能禁用,请开启');
- var session_id = '';
- var parms=new RegExp("[?]");
- if(session_id == 0){
- var newURL = document.URL + '?CookieUnable=1';
- if(parms.exec(document.URL) !== null)
- newURL = document.URL + '&CookieUnable=1';
- window.location.href = newURL;
- }else{
- var share_Session = document.getElementById('phpZF_share_Session');
- if(parms.exec(share_Session.href) !== null){
- share_Session.href = share_Session.href + '&session_id='+session_id;
- } else {
- share_Session.href = share_Session.href + '?session_id='+session_id;
- }
- }
- }
PHP
- session_start();
- isset($_SESSION['session'])?null:$_SESSION['session']='session';
- if(@$_GET['CookieUnable'] == '1' ){
- $session_id = session_id();
- $file_name = $session_id.'.txt';
- $handle = fopen($file_name,'w');
- fwrite($handle, serialize($_SESSION));
- fclose($handle);
- }else{
- $session_id = 0;
- }
- ?>
然后在页面中我会对特定的url中加上session_id 这样在网站中就可以使用session_id了
- <body>
- <div id="phpZF_check_javascript_enable"><h1>您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascripth1>div>
- <div>
- <a id="phpZF_share_Session" href="show.php">Server Session Informationa>;
- div>
- body>
- html>
那么这样就算处理完成,整体的代码
目录结构:
set.php //入口
show.php //共享session 查看session
20rt5ja239sipblatlng8o0084.txt//这个你可以指定个目录或者数据库存储 session数据
20rt5ja2*************o0084.txt
set.php Code
- session_start();
- isset($_SESSION['session'])?null:$_SESSION['session']='session';
- if(@$_GET['CookieUnable'] == '1' ){
- $session_id = session_id();
- $file_name = $session_id.'.txt';
- $handle = fopen($file_name,'w');
- fwrite($handle, serialize($_SESSION));
- fclose($handle);
- }else{
- $session_id = 0;
- }
- ?>
-
-
- 客户端Javascript/Cookie/Session 检测
- "UTF-8"/>
-
-
-
-
"phpZF_check_javascript_enable">您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascript
-
-
-
show.php Code
- if(isset($_GET['session_id'])){
- header("Content-type:text/html;charset=UTF-8");
- $file_name = $_GET['session_id'].'.txt';
- if(file_exists($file_name)){
- $Session = unserialize(file_get_contents($file_name));
- echo '
关闭Cookie下'
; - print_r($Session);
- }
- }else{
- session_start();
- header("Content-type:text/html;charset=UTF-8");
- echo '
开启Cookie下'
; - print_r($_SESSION);
- }
Session 存储文件内容 我这里序列化了数组保存
a:1:{s:7:"session";s:7:"session";}
基本上就这些,哈哈虽然有点凌乱但是终于解决了,以前一直拖,拖着不是个事,早晚要解决,就算到一点嘿嘿值得滴!
结果是这样滴:作为参考
图一:
本文出自 “web开发之php” 博客,请务必保留此出处http://phpzf.blog.51cto.com/3011675/792298
阅读(703) | 评论(0) | 转发(0) |