浏览器在不开启Cookie下Session处理小结

简介:

 记得刚开始接触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所以要验证下

 


 
 
  1. <html> 
  2. <head> 
  3. <title>客户端Javascript/Cookie/Session 检测</title> 
  4. <meta charset="UTF-8"/> 
  5. <script type="text/Javascript"
  6.     var phpZF = {}; 
  7.     phpZF.checkJavascriptEnable = function(){//检查浏览器是否支持Javascript 
  8.             var check_javascript_enable = document.getElementById('phpZF_check_javascript_enable'); 
  9.             check_javascript_enable.parentNode.removeChild(check_javascript_enable); 
  10.     } 
  11.  
  12.     window.onload = function(){ //这里用的是onload domready更好,要判断domready需要另写代码,回头单独写 
  13.         phpZF.checkJavascriptEnable();//检查浏览器是否支持Javascript 
  14.  
  15.     } 
  16.  
  17. </script> 
  18. </head> 
  19. <body> 
  20.     <div id="phpZF_check_javascript_enable"><h1>您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascript</h1></div> 
  21. </body> 
  22. </html> 

如果客户端不支持Javascript那么就会有文本提示让用户开启

第二步:检测是否支持Cookie

关键函数


 
 
  1. phpZF.checkCookieEnable = function(){//检查浏览器是否开启Cookie 
  2.         var cookie_enable = false
  3.         if(navigator.cookiesEnabled) 
  4.             return true
  5.         document.cookie = "checkCookie=yes"
  6.         var cookieSet = document.cookie; 
  7.         if(cookieSet.indexOf("checkCookie=yes") > -1) 
  8.             cookie_enable = true
  9.         document.cookie = ""
  10.         return cookie_enable; 

如果开启那么很好我们正常流程走

假如不开启,那么我会在浏览器载入完成后的时候重新载入,不过这次载入我会在原来的url后面加上一个浏览器不支持cookie的参数

PHP接收后就会特别处理session 

关键函数

Javascript


 
 
  1. phpZF.unableCookieShareSession = function() { //在关闭Cookie的情况下使用session 
  2.     alert('对不起,您的浏览器Cookie功能禁用,请开启'); 
  3.     var session_id = '<?php echo $session_id;?>'
  4.     var parms=new RegExp("[?]"); 
  5.     if(session_id == 0){ 
  6.         var newURL = document.URL + '?CookieUnable=1'
  7.         if(parms.exec(document.URL) !== null
  8.             newURL = document.URL + '&CookieUnable=1'
  9.         window.location.href = newURL; 
  10.     }else
  11.         var share_Session = document.getElementById('phpZF_share_Session'); 
  12.         if(parms.exec(share_Session.href) !== null){ 
  13.             share_Session.href = share_Session.href + '&session_id='+session_id; 
  14.         } else { 
  15.             share_Session.href = share_Session.href + '?session_id='+session_id; 
  16.         } 
  17.     } 

PHP

 


 
 
  1. <?php 
  2. session_start(); 
  3. isset($_SESSION['session'])?null:$_SESSION['session']='session'
  4. if(@$_GET['CookieUnable'] == '1' ){//如果当前浏览器关闭cookie 那么重新加载 
  5.     $session_id = session_id(); //获取当前的session_id; 
  6.     $file_name = $session_id.'.txt';//这里暂时用文件保存 可以用任何的存储介质,通常为数据库这里为了讲述方法用创建文件解决 
  7.     $handle = fopen($file_name,'w'); 
  8.     fwrite($handle, serialize($_SESSION)); 
  9.     fclose($handle); 
  10. }else
  11.     $session_id = 0; 
  12. ?> 

然后在页面中我会对特定的url中加上session_id 这样在网站中就可以使用session_id了

 

 


 
 
  1. <body> 
  2.     <div id="phpZF_check_javascript_enable"><h1>您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascript</h1></div> 
  3.     <div> 
  4.         <a id="phpZF_share_Session" href="show.php">Server Session Information</a>
  5.     </div> 
  6. </body> 
  7. </html> 

那么这样就算处理完成,整体的代码

目录结构:

set.php //入口

show.php //共享session 查看session

20rt5ja239sipblatlng8o0084.txt//这个你可以指定个目录或者数据库存储 session数据

20rt5ja2*************o0084.txt 

set.php Code

 


 
 
  1. <?php 
  2. session_start(); 
  3. isset($_SESSION['session'])?null:$_SESSION['session']='session'
  4. if(@$_GET['CookieUnable'] == '1' ){//如果当前浏览器关闭cookie 那么重新加载 
  5.     $session_id = session_id(); //获取当前的session_id; 
  6.     $file_name = $session_id.'.txt';//这里暂时用文件保存 可以用任何的存储介质,通常为数据库这里为了讲述方法用创建文件解决 
  7.     $handle = fopen($file_name,'w'); 
  8.     fwrite($handle, serialize($_SESSION)); 
  9.     fclose($handle); 
  10. }else
  11.     $session_id = 0; 
  12. ?> 
  13. <html> 
  14. <head> 
  15. <title>客户端Javascript/Cookie/Session 检测</title> 
  16. <meta charset="UTF-8"/> 
  17. <script type="text/Javascript"
  18.     var phpZF = {}; 
  19.     phpZF.checkJavascriptEnable = function(){//检查浏览器是否支持Javascript 
  20.             var check_javascript_enable = document.getElementById('phpZF_check_javascript_enable'); 
  21.             check_javascript_enable.parentNode.removeChild(check_javascript_enable); 
  22.     } 
  23.     phpZF.checkCookieEnable = function(){//检查浏览器是否开启Cookie 
  24.             var cookie_enable = false; 
  25.             if(navigator.cookiesEnabled) 
  26.                 return true; 
  27.             document.cookie = "checkCookie=yes"
  28.             var cookieSet = document.cookie; 
  29.             if(cookieSet.indexOf("checkCookie=yes") > -1) 
  30.                 cookie_enable = true; 
  31.             document.cookie = ""
  32.             return cookie_enable; 
  33.     } 
  34.     phpZF.unableCookieShareSession = function() { //在关闭Cookie的情况下使用session 
  35.         alert('对不起,您的浏览器Cookie功能禁用,请开启'); 
  36.         var session_id = '<?php echo $session_id;?>'
  37.         var parms=new RegExp("[?]"); 
  38.         if(session_id == 0){ 
  39.             var newURL = document.URL + '?CookieUnable=1'
  40.             if(parms.exec(document.URL) !== null) 
  41.                 newURL = document.URL + '&CookieUnable=1'
  42.             window.location.href = newURL; 
  43.         }else
  44.             var share_Session = document.getElementById('phpZF_share_Session'); 
  45.             if(parms.exec(share_Session.href) !== null){ 
  46.                 share_Session.href = share_Session.href + '&session_id='+session_id; 
  47.             } else { 
  48.                 share_Session.href = share_Session.href + '?session_id='+session_id; 
  49.             } 
  50.         } 
  51.     } 
  52.  
  53.     window.onload = function(){ //这里用的是onload domready更好,要判断domready需要另写代码,回头单独写 
  54.         phpZF.checkJavascriptEnable();//检查浏览器是否支持Javascript 
  55.         if(!phpZF.checkCookieEnable())//检查浏览器是否支持Cookie 
  56.             phpZF.unableCookieShareSession();//在不支持Cookie的情况下处理session问题 
  57.     } 
  58.  
  59. </script> 
  60. </head> 
  61. <body> 
  62.     <div id="phpZF_check_javascript_enable"><h1>您的浏览器没有开启Javascript,本网站将无法正常运行,请开启Javascript</h1></div> 
  63.     <div> 
  64.         <a id="phpZF_share_Session" href="show.php">Server Session Information</a>; 
  65.     </div> 
  66. </body> 
  67. </html> 

show.php Code


 
 
  1. <?php 
  2. if(isset($_GET['session_id'])){ 
  3.     header("Content-type:text/html;charset=UTF-8"); 
  4.     $file_name = $_GET['session_id'].'.txt'
  5.     if(file_exists($file_name)){ 
  6.         $Session = unserialize(file_get_contents($file_name)); 
  7.         echo '<pre>关闭Cookie下'
  8.         print_r($Session); 
  9.     } 
  10. }else
  11.     session_start(); 
  12.     header("Content-type:text/html;charset=UTF-8"); 
  13.     echo '<pre>开启Cookie下'
  14.     print_r($_SESSION); 

Session 存储文件内容 我这里序列化了数组保存

a:1:{s:7:"session";s:7:"session";}

基本上就这些,哈哈虽然有点凌乱但是终于解决了,以前一直拖,拖着不是个事,早晚要解决,就算到一点嘿嘿值得滴!

结果是这样滴:作为参考

图一:





    本文转自kefirking 51CTO博客,原文链接:http://blog.51cto.com/phpzf/792298,如需转载请自行联系原作者







相关文章
|
19天前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
41 4
|
23天前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
1月前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
165 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
|
1月前
|
存储 安全 数据安全/隐私保护
Cookie 和 Session 的区别及使用 Session 进行身份验证的方法
【10月更文挑战第12天】总之,Cookie 和 Session 各有特点,在不同的场景中发挥着不同的作用。使用 Session 进行身份验证是常见的做法,通过合理的设计和管理,可以确保用户身份的安全和可靠验证。
22 1
|
2月前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
2月前
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
2月前
|
存储 安全 NoSQL
Cookie、Session、Token 解析
Cookie、Session、Token 解析
62 0
|
2月前
|
存储 编解码 JSON
解决浏览器存储问题,不得不了解的cookie、localStorage和sessionStorage
该文章详细对比了浏览器存储机制中的cookie、localStorage和sessionStorage的不同之处,以及各自的适用场景。
|
3月前
|
存储 JavaScript 前端开发
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
210 1
|
3月前
|
存储
【Azure APIM】APIM 策略语句如何来设置多个Cookie值让浏览器保存
【Azure APIM】APIM 策略语句如何来设置多个Cookie值让浏览器保存