记得刚开始接触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所以要验证下
- <html>
- <head>
- <title>客户端Javascript/Cookie/Session 检测</title>
- <meta charset="UTF-8"/>
- <script type="text/Javascript">
- var phpZF = {};
- phpZF.checkJavascriptEnable = function(){//检查浏览器是否支持Javascript
- var check_javascript_enable = document.getElementById('phpZF_check_javascript_enable');
- check_javascript_enable.parentNode.removeChild(check_javascript_enable);
- }
- window.onload = function(){ //这里用的是onload domready更好,要判断domready需要另写代码,回头单独写
- phpZF.checkJavascriptEnable();//检查浏览器是否支持Javascript
- }
- </script>
- </head>
- <body>
- <div id="phpZF_check_javascript_enable"><h1>您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascript</h1></div>
- </body>
- </html>
如果客户端不支持Javascript那么就会有文本提示让用户开启
第二步:检测是否支持Cookie
关键函数
- phpZF.checkCookieEnable = function(){//检查浏览器是否开启Cookie
- 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() { //在关闭Cookie的情况下使用session
- alert('对不起,您的浏览器Cookie功能禁用,请开启');
- var session_id = '<?php echo $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
- <?php
- session_start();
- isset($_SESSION['session'])?null:$_SESSION['session']='session';
- if(@$_GET['CookieUnable'] == '1' ){//如果当前浏览器关闭cookie 那么重新加载
- $session_id = 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,本网站将无法正常运行,请开启Javascript</h1></div>
- <div>
- <a id="phpZF_share_Session" href="show.php">Server Session Information</a>;
- </div>
- </body>
- </html>
那么这样就算处理完成,整体的代码
目录结构:
set.php //入口
show.php //共享session 查看session
20rt5ja239sipblatlng8o0084.txt//这个你可以指定个目录或者数据库存储 session数据
20rt5ja2*************o0084.txt
set.php Code
- <?php
- session_start();
- isset($_SESSION['session'])?null:$_SESSION['session']='session';
- if(@$_GET['CookieUnable'] == '1' ){//如果当前浏览器关闭cookie 那么重新加载
- $session_id = session_id(); //获取当前的session_id;
- $file_name = $session_id.'.txt';//这里暂时用文件保存 可以用任何的存储介质,通常为数据库这里为了讲述方法用创建文件解决
- $handle = fopen($file_name,'w');
- fwrite($handle, serialize($_SESSION));
- fclose($handle);
- }else{
- $session_id = 0;
- }
- ?>
- <html>
- <head>
- <title>客户端Javascript/Cookie/Session 检测</title>
- <meta charset="UTF-8"/>
- <script type="text/Javascript">
- var phpZF = {};
- phpZF.checkJavascriptEnable = function(){//检查浏览器是否支持Javascript
- var check_javascript_enable = document.getElementById('phpZF_check_javascript_enable');
- check_javascript_enable.parentNode.removeChild(check_javascript_enable);
- }
- phpZF.checkCookieEnable = function(){//检查浏览器是否开启Cookie
- 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;
- }
- phpZF.unableCookieShareSession = function() { //在关闭Cookie的情况下使用session
- alert('对不起,您的浏览器Cookie功能禁用,请开启');
- var session_id = '<?php echo $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;
- }
- }
- }
- window.onload = function(){ //这里用的是onload domready更好,要判断domready需要另写代码,回头单独写
- phpZF.checkJavascriptEnable();//检查浏览器是否支持Javascript
- if(!phpZF.checkCookieEnable())//检查浏览器是否支持Cookie
- phpZF.unableCookieShareSession();//在不支持Cookie的情况下处理session问题
- }
- </script>
- </head>
- <body>
- <div id="phpZF_check_javascript_enable"><h1>您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascript</h1></div>
- <div>
- <a id="phpZF_share_Session" href="show.php">Server Session Information</a>;
- </div>
- </body>
- </html>
show.php Code
- <?php
- 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 '<pre>关闭Cookie下';
- print_r($Session);
- }
- }else{
- session_start();
- header("Content-type:text/html;charset=UTF-8");
- echo '<pre>开启Cookie下';
- print_r($_SESSION);
- }
Session 存储文件内容 我这里序列化了数组保存
a:1:{s:7:"session";s:7:"session";}
基本上就这些,哈哈虽然有点凌乱但是终于解决了,以前一直拖,拖着不是个事,早晚要解决,就算到一点嘿嘿值得滴!
结果是这样滴:作为参考
图一:
本文转自kefirking 51CTO博客,原文链接:http://blog.51cto.com/phpzf/792298,如需转载请自行联系原作者