session和cookie的深入认识

session控制管理及js关闭浏览器销毁session

2013年09月13日  ⁄ 综合 ⁄ 共 1651字 ⁄ 字号  小 中 大  ⁄ 评论关闭

       因为目前项目是基于session来判断当前用户的详细情况,从一致性和可靠性来考虑,应该确保一个session一个用户。

在网上看了一些文章及经验,最后在项目中采用了cookie+session来控制的这种方法。现总结如下:

1、概念理解:cookie保存在客户端,session保存在服务器。一个线程一个session(不知道对不对,请指教)。但是,一个浏览器多个标签共用一个session的

2、登陆控制:

(1)在index.html上先判断浏览器是否支持cookie,若不支持则不能commit。

(2)在登陆Service类中判断(读取之前保存在cookie的SESSIONID是否与getSeesion()一致):

     String sessionID = request.getSession().getId();
     Cookie[] webCookie = request.getCookies();
     for(int i=0;i<webCookie.length;i++){
     if("SESSIONID".equals(webCookie[i].getName()) && sessionID.equals(webCookie[i].getValue())){
      action.addMessage("已登陆其他用户!请【安全退出】再登陆!");
      return false;
     }
     }

若登陆成功,将SessionID写入客户端的cookie:

       Cookie cookie = new Cookie("SESSIONID",sessionID);
       httpServletResponse.addCookie(cookie);

(3)由(1)(2)保证了一个用户对于一个Session,现在需要就是针对各种情况销毁Session。

这里主要考虑的是关闭浏览器时销毁sessoin。

//关闭浏览器销毁Seesion
    var xmlHttp;
    function createXMLHttpRequest()
   {
      //IE
      if (window.ActiveXObject)
      {
       xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      //Other
      else if (window.XMLHttpRequest)
      {
       xmlHttp = new XMLHttpRequest();
      }
   }
   function destorySession()
   {
                       try{
                        createXMLHttpRequest();
                        var url = "destorysession.jsp";
                        xmlHttp.open("POST", url, false);
                        xmlHttp.send(null);
                        var result = xmlHttp.responseText;
                     }
                     catch(e)
                    {
                      alert("销毁Session异常!");
                     }
    }

destorysession.jsp:

<%@page contentType="text/html; charset=UTF-8"%>
<html>
<head>
<title></title>
<body>
<%session.invalidate

(); %>
</body>

</html>

在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session
id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。

恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

附:开两个浏览器窗口访问应用程序会使用同一个session还是不同的session? 
对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。


如果用户不点击网站的“退出”链接,而直接关闭浏览器(或者强制关闭浏览器进程、死机等),服务器无法处理用户退出网站的请求,解决方式如下:
方式1:在每个页面中加入隐藏的IFrame,以异步刷新的方式定期刷新iframe页面,如每隔10S刷新一次,当服务器在一定的时间内未收到用户的刷新请求,则认为用户已经退出
优点:能在短时间内判断出用户是否已经退出   缺点:增加用户请求次数,所消耗的服务器资源较大
方式2:使用cookie保存用户登录信息,不要设置cookie的过期时间,当关闭浏览器时,cookie会自动过期
优点:处理方便    缺点:用户浏览器不一定支持cookie,也就无法实现该方式
方式3:在页面中添加onunload事件,当关闭浏览器时,自动跳转到“退出”页面(loginout.action)
优点:退出时,能及时进行处理    缺点:当用户打开多个页面时,关闭任何一个页面都有可能导致用户的退出
方式4:记录用户的每次操作时间(包括页面刷新、提交表单等),在数据库中用作业每隔一段时间检查上次的操作时间,当操作时间大于一定的数值时,就认为该用户已经退出
优点:无论哪种非正常退出,都能够进行处理   缺点:进行检查的时间间隔不容易确定,如果用户在线,当长时间未操作,也会认为用户已经退出
方式5:等待session失效
优点:你可以不用做任何工作  缺点:用户可以在你等待的这段时间内重新登录。


关闭浏览器使session立即失效的方法

2013年08月19日  ⁄ 综合 ⁄ 共 481字 ⁄ 字号  小 中 大  ⁄ 评论关闭

<script language="javaScript">
function removeline(){
if(event.clientX<0&&event.clientY<0)
  {
document.write('<iframe width="100" height="100" src="page/removeline.jsp"></iframe><OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0  id=WebBrowser width=0></OBJECT>');
document.all.WebBrowser.ExecWB(45,1);
}
}
</script>

if(event.clientX<0&&event.clientY<0)判断浏览器是关闭还是刷新 ,因为刷新也会调用onunload

document.all.WebBrowser.ExecWB(45,1);是无提示的关闭浏览器

removeline.jsp 加上invalidate()代码就可以了 


通常,会话管理是通过服务器将 Session ID 作为一个 cookie 存储在用户的 Web 浏览器中来唯一标识每个用户会话。如果浏览器不支持 cookies,或者将浏览器设置为不接受 cookies,我们可以通过 URL 重写来实现会话管理。

  实质上 URL 重写是通过向 URL 连接添加参数,并把 session ID 作为值包含在连接中。然而,为使这生效,你需要为你的 servlet 响应部分的每个连接添加 session ID 。

   把 session ID 加到一个连接可以使用一对方法来简化:response.encodeURL() 使 URL 包含 session ID,如果你需要使用重定向,可以使用 response.encodeRedirectURL () 来对 URL 进行编码。

  encodeURL () 及 encodeRedirectedURL () 方法首先判断 cookies 是否被浏览器支持;如果支持,则参数 URL 被原样返回,session ID 将通过 cookies 来维持。

  来看下面的例子,两个 JSP 文件:hello1.jsp 和 hello2.jsp,及它们之间的影响。我们在 hello1.jsp 中简单的创建一个会话,并在 session 中存储一个对象实例。接着用户可以点击页面的连接到达 hello2.jsp。在 hello2.jsp 中,我们从 session 中获取原先放置的对象并显示它的内容。注意,我们在 hello1.jsp 中调用了 encodeURL() 方法来获得 hello2.jsp 的链接,使得在浏览器停用 cookies 的情况下,session ID 自动添加到 URL,hello2.jsp 仍能得到 session 对象。

  首先在启用 cookies 的情况下运行。然后关闭对 cookie 的支持,重启浏览器,再运行一次。每次你都可以看到会话管理在起作用,并能在页之间传递信息。

注意,如果你想让这个例子能在关闭了 cookies 的浏览器中工作,你的 JSP 引擎必须支持 URL 重写。

hello1.jsp

<%@ page session="true" %> 
<% 
Integer num = new Integer(100); 
session.putValue("num",num); 
String url =response.encodeURL("hello2.jsp"); 
%> 
<a href='<%=url%>'>hello2.jsp</a>

hello2.jsp

<%@ page session="true" %> 
<% 
Integer i= (Integer)session.getValue("num"); 
out.println("Num value in session is "+i.intValue()); 
%>

axeon于2000-08-03 11:05:38发送 
Copyright © 2000 www.jsper.com All rights reserved. 
The catalog script used on this site was written by axeon 


关闭时的方法:

function  window.onunload()
{
   alert("窗体关闭了!");
}

如果需要在关闭前给用户关闭提示,而且想在用户点击浏览器关闭按钮关闭时,也只有用以下的方法才能在退出时,执行事件:

function  window.onbeforeunload()   
{   
    
if( event.clientX>document.body.clientWidth && event.clientY<0 || event.altKey )   
    
{   
        window.event.returnValue
="确定要退出本页吗?";   
    }

}

浅析http协议、cookies和session机制、浏览器缓存 .

2013年09月01日  ⁄ 综合 ⁄ 共 10456字 ⁄ 字号  小 中 大  ⁄ 评论关闭

来源:http://www.phpben.com/?post=77

最近几天在复习http协议中headers,cookies、session、缓存等相关知识,发现些新知识点。

这篇文章注重结合PHP去理解这些内容,也就是比较注重实践部分。

一、            http headers          

NO1:对于web应用,用户群在客户端 (各种浏览器)点击任何一个连接向服务器发送http请求,这过程肯定需要3次握手,建立连接,服务器响应返回数据。

每次请求都有头部和实体部分,先看下面笔者监听QQ空间的headers,QQ空间的原因是它头部内容比较全

  1. Request Headers:  
  2.   
  3. GET http://user.qzone.qq.com/445235728 HTTP/1.1  
  4.   
  5. Host: user.qzone.qq.com  
  6.   
  7. Connection: keep-alive  
  8.   
  9. Cache-Control: max-age=0  
  10.   
  11. User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11  
  12.   
  13. Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  
  14.   
  15. Referer: http://qzone.qq.com/  
  16.   
  17. Accept-Encoding:gzip,deflate,sdch  
  18.   
  19. Accept-Language: zh-CN,zh;q=0.8  
  20.   
  21. Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3  
  22.   
  23. Cookie:o_cookie=445235728;(省略很多……)  
  24.   
  25. If-Modified-Since: Wed, 13 Jun 2012 01:32:19 GMT  
  26.   
  27. -----------------  
  28.   
  29. Response Headers:  
  30.   
  31. HTTP/1.1 200 OK  
  32.   
  33. Connection:close  
  34.   
  35. Server: QZHTTP-2.34.0  
  36.   
  37. Date: Wed, 13 Jun 2012 02:59:31 GMT  
  38.   
  39. Content-Encoding: gzip  
  40.   
  41. Set-Cookie:login_time=61F0EEA02D704B1DBCF25166A74941B24F4BE24B205C466F;PATH=/; DOMAIN=qzone.qq.com  
  42.   
  43. Set-Cookie:Loading=Yes;expires=Wed,13-Jun-201216:00:00GMT;PATH=/;DOMAIN=qzone.qq.com X-UA-Compatible: IE=Edge Last-Modified: Wed, 13 Jun 2012 02:59:31 GMT  
  44.   
  45. Cache-Control: max-age=0, no-transform  
  46.   
  47. Content-Type: text/html;charset=utf-8  
  48.   
  49. Transfer-Encoding: chunked  

 

客户端向服务端发请求headers和服务端响应客户端headers图:

 

通过图片可以看出:

1、   客户端请求headers包含了请求行和一些头域。

请求行:请求的方法 统一资源标识器(URL)协议版本 ------这三者用空格分开,最后换行回车(\r\n) 例如:GET http://user.qzone.qq.com/445235728 HTTP/1.1

各种头域:这些头域都是有关键字和键值成对组合,最后换行回车(\r\n)结束,这些头域告诉服务器应该怎么去响应以及本身一些信息。

2、   服务器响应 

状态行:协议版本 响应状态 状态描述 ------这三者用空格分开,最后换行回车(\r\n) 例如:HTTP/1.1 200 OK

各种头域:这些头域也是有关键字和键值成对组合,最后换行回车(\r\n)结束,这些头域告诉客户端应该怎么去响应以及本身一些信息。

 

NO2

这里就不一一说每个头域的概念和作用,想了解的请看:http://www.phpben.com/?post=34 现在介绍几个认为重要、在一些网站上的测试数据、以及请求返回各头域php代码实现

测试时间:2012.6.14前

测试对象:csdn 、cnbeta 、cnblos、腾讯(QQ空间、朋友网、新闻网)、新浪(微博、主页)、人人网、百度、淘宝、优酷、土豆这些网站

(1)     Connection头域:这个头域只有http/1.1才有,默认是keep-alive值表示长连接,这样的话就不用每请求一个资源比如图片,css文件,js文件都要和服务器进行3此握手连接,这个在一定程度上弥补了http没状态的一个缺陷,减少连接服务器的时间。

查看测试网站Connection头域发现腾讯QQ空间、腾讯新闻网、新浪主页和微博,优酷和土豆Connection:close;除了这些其他的都是Connection:keep-alive

为什么?

1、connection: keep-alive 能正常使用的一个前提条件是还要提供content-length的头域告诉客户端正文的长度。那计算正文长度是个问题,对于多内容,集群服务器来说不是件易事。腾讯和新浪,优酷的这些都很难计算,对与工程师来说之间关闭了(默认是打开的)。

2、老服务器端不支持,对于腾讯,新浪这些老油条,服务器集群很庞大,难免有些老旧的不支持长连接的,为了一些兼容性问题,直接关闭了

Ps:这两点原因未求证过!^-^

用php headers(“Connection:keep-alive”);

(2)     Content-Encoding头域

Content-Encoding文档的编码(Encode)方法.

上述网站出了cnbeta不用gzip压缩,优酷用deflate,其余都是。这也透漏一个重要信息,那就phper要掌握压缩gzip传输技术。

Php可以通过mod_gzip模块来实现。代码:ob_start("ob_gzhandler");

(3)     Server头域暴漏服务器重要的安全信息。

Csdn:Server:nginx/0.7.68  ------------版本都暴露

腾讯QQ空间:Server:QZHTTP-2.34.0--------某位tx朋友透漏这是内部自己开发的服务器,这个可够安全

新浪微博:Server:apache -------------这个没暴漏版本

凤凰网:Server: nginx/0.8.53

人人网:Server:nginx/1.2.0

淘宝网:Tengine ---------这是淘宝内部技术团队开发的web服务器,基于Nginx

cnblogs博客园:Server:Microsoft-IIS/7.5

腾讯朋友网:Tencent/PWS ---------腾讯内部开发

腾讯新闻网:Server:squid/3.1.18

优酷网:Server: fswww1-----------是不是内部就不清楚,至少笔者不知道什么来的^_^

土豆网:Tengine/1.2.3

百度:server: BWS/1.0 ---------应该也是百度内部自己开发的服务器

很明显Server头域是返回服务器的信息,但也可以说暴漏信息,面对这个问题,大公司就自己开发基于自己功能的内部服务器。

(4)     X-Powered-By头域可供修改,基于安全则可以修改

X-Powered-By头域反应什么语言什么版本执行后台程序。这个可以同个header函数修改

header("X-Powered-By:acb");

(5)     Cache-control、expires、last-modified等重要头域

Cache-control:指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。

Php代码实现:header("cache-control: abc");abc是上述指令值一个或多个,多个用’,’分开

Expires:告诉浏览器指明应该在什么时候认为文档已经过期,从而不再缓存它。代码实现:header("Expires:". date('D, d M Y H:i:s \G\M\T', time()+10));--------这个是把时间截转化成格林时区字符串给expires头域,这个显示时间会比中国北京时间少8个小时,东8区的实现:header("Expires:". date('r', time()+10))

last-modified:这个是服务器返回给浏览器,浏览器下次请求则把该值赋给if-modified-since头域传给服务器,服务器就可以根据此值判断是否有改变,有则继续运行下去,否者返回304 not modified。Php设置expires头域一样。

代码:

  1. <?php 
  2. if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && (time()-strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) < 10)) {  
  3.   
  4.   header("HTTP/1.1 304 Not Modified");  
  5.   
  6.      exit;  
  7.   
  8.    }  
  9.   
  10. header("Last-Modified: " . date('D, d M Y H:i:s \G\M\T', time()) );或者header("Last-Modified: " . date('r', time()) );
     
  11. ?> 

 

前者是格林时间格式,后者是中国时间。需要注意的就是php.ini 的时区prc则用后则,否者前者。笔者曾经试过在时区是prc的情况下用了前者,导致time()-strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) <0永远成立,因为是负值。

注意:当请求页面有session_start()的时候,则不管是否有expires、cache-control、last-modified设置,则返回给客户端Cache-Control头域为Cache-Control:no-store, no-cache, must-revalidate Expires头域 Expires:Thu, 19 Nov 1981 08:52:00 GMT。这个问题烦了笔者2天,都以为php.ini 或是apache的问题。最后竟然是session_start()的问题。

二、             浏览器缓存动态

前面介绍了http headers几个告诉浏览器如何处理缓存。但不同浏览器处理各种头域的方式不同,以下就是笔者。

Ps:各个浏览器监听http headers的方法可以查看:http://www.phpben.com/?post=76

(1)   header(“cache-control: no-store”)

 

IE9

Google17.0

Firefox11

Maxthon3

点击刷新键

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

地址栏回车

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

点击后退键

同上

同上

同上

同上

 

(2)   header(“cache-control: no-cache”)

 

IE9

Google17.0

Firefox11

Maxthon3

点击刷新键

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

地址栏回车

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

点击后退键

同上

From cache

From cache

同上

 

(3)   header(“cache-control:bublic”)

 

IE9

Google17.0

Firefox11

Maxthon3

点击刷新键

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

地址栏回车

from cache

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

点击后退键

From cache

From cache

From cache

同上

(4)   header("cache-control:private"); header("cache-control: must-revalidate ")

 

IE9

Google17.0

Firefox11

Maxthon3

点击刷新键

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

地址栏回车

除第一次外都是from cache

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

点击后退键

From cache

From cache

From cache

同上

(5)   header("cache-control:max-age=num");num是秒数

 

IE9

Google17.0

Firefox11

Maxthon3

点击刷新键

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

地址栏回车

秒数<num from cache

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

点击后退键

From cache

From cache

From cache

同上

(6)   header("Expires:". date('D, d M Y H:i:s \G\M\T', time()+num)); num是秒数

 

IE9

Google17.0

Firefox11

Maxthon3

点击刷新键

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

地址栏回车

秒数<num from cache

重发请求,返回200状态

重发请求,返回200状态

重发请求,返回200状态

点击后退键

From cache

From cache

From cache

同上

(7)   if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && (time()-strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) < num)) {

  header("HTTP/1.1 304 Not Modified");

     exit;

   } header("Last-Modified: " . date('D, d M Y H:i:s \G\M\T', time()) );

 

IE9

Google17.0

Firefox11

Maxthon3

点击刷新键

秒数<num 304 not modified

秒数<num 304 not modified

秒数<num 304 not modified

重发请求,返回200状态

地址栏回车

from cache

秒数<num 304 not modified

秒数<num 304 not modified

重发请求,返回200状态

点击后退键

From cache

From cache

From cache

同上

 

结论:

1、   刷新对于任何浏览器且不管是什么cache-control,都会重新请求,一般返回是200,除非Last-Modified设置

2、   后退键除非no-cache; no-store外都是使用缓存

3、   Cache-control:no-store 在浏览器中任何操作都重新提交请求,包括后退

4、   遨游3的缓存很差

5、   IE9 的缓存很强,所以用ie9调试的时候尽可能点刷新而不是在地址栏回车

 

鉴于这种情况,对于不同的应用(有些要缓存,有些经常更新)对于不同的国家各种浏览器份额,而哪种缓存方式。中国IE比较多,加上360浏览器的加入(用IE内核),那就要主要参照IE浏览器。

但笔者还是比较喜欢header("Last-Modified: " . date('D, d M Y H:i:s \G\M\T', time()) );这种方式。结合起来connection:keep-alive能让缓存技术更成熟。

注意

1、   也许你会问,用Cache-control:no-store或Cache-control:no-store,但调试页面还是没原来的缓存。然后清除浏览器缓存关掉重启浏览器, 缓存还在。这是因为你的web应用用了文件缓存如ecshop常出现这种情况,这种情况就要进web应用后台删除文件缓存。

2、   调试的时候尽可能不要在地址栏回车,特别是IE,google还好一点,但是要知道这次的测试只是各个浏览器中的一个版本,所以调试的时候尽可能点刷新按钮。

3、   但在cache-control:max-age=num 和expires 一起使用的时候,前者级别比较高,浏览器会忽略expires的设置。(上面没给出测试内容)

三、             Session和cookies

Session 、cookies是程序员永远讨论的话题之一。

1、   简单说一下cookies、session

(1)     Cookies是保存在客户端的小段文本,随客户端点每一个请求发送该url下的所有cookies到服务器端。比如在谷歌浏览器下,打开ww.abc.com下的两个文件,a.php包含cookies1和cookies2,b.php包含了cookies3和cookies4,那么在a.php或b.php 点任意一个连接(当然是ww.abc.com服务器上的),浏览器就会把cookies1~4这4个cookies发送给服务器。但是如果在IE9有打开一个包含cookies5的c.php,哪门在google浏览器点击连接是不会发送cookies5的。

(2)     Session则保存服务器段,通过唯一的值sessionID来区别每一个用户。SessionID随每个连接请求发送到服务器,服务器根据sessionID来识别客户端,再通过session 的key获取session值。SessionID传回服务器的实现方式可以通过cookies和url回写来实现。

注意

1、   同一个浏览器打开同一个文件,如a.php ,或同时有设置session的两个文件a.php、b.php sessionID则只有一个。(时间上不能是打开a.php 关闭浏览器再打开b.php)

2、   不同浏览器在同一时间打开同意文件的sessionID也不一样

3、   sessionID是服务器生成的不规则唯一字符串,如:

PHPSESSID=05dbfffd3453b7be02898fdca4fcd82b;------ PHPSESSID可以通过php.ini中session.name来改变,所以笔者在监听一些大型网站的时候查不出PHPSESSID,这是一个安全因素。

(3)     cookies、session在php中的主要相关参数

(1)     session.save_handler = ”files”

默认以文件方式存取session数据,如果想要使用自定义的处理器来存取session数据,比如数据库,用”user”。

(2)     session.use_cookies = 1 前面说到sessionID用cookies来实现,这里就是,1表示用cookies

(3)     session.use_trans_sid = 0 上面是用cookies来实现sessionID,这里值若是1则使用url回写方式,级别比session.use_cookies高

(4)     session.use_only_cookies = 0 值为1则sessionID只可以用cookies实现,级别比前两个高

(5)     session.cache_expire =180  session 缓存过期的秒数

(6)     session.gc_maxlifetime = 1440

设定保存的session文件生存期,超过此参数设定秒数后,保存的数据将被视为’垃圾’并由垃圾回收程序清理。判断标准是最后访问数据的时间(对于FAT文件系统是最后刷新数据的时间)。如果多个脚本共享同一个session.save_path目录但session.gc_maxlifetime不同,将以所有session.gc_maxlifetime指令中的最小值为准。

(4)     图说cookie 、ssession

php代码如下

  1. session_start();  
  2.   
  3. $_SESSION['favcolor'] = 'green';  
  4.   
  5. $_SESSION['animal']   = 'cat';  
  6.   
  7. $_SESSION['time']     = time();  
  8.   
  9. setcookie("cookie1","www.phpben.com",time()+3600*10);  
  10.   
  11. setcookie("cookie2","www.phpben.com",time()+3600*10);  

 

图片:

结论:

1、 第一次请求是没用cookies的,而第二次有PHPSESSID和两个cookies是因为服务器第一请求返回这个三个cookies。

2、第二次请求比第一次多返回PHPSESSID这个cookies,在第二次则没有了,直到session过期后重新设置。

2、   ;浏览器关掉cookies,session是否可以正常运行?

前面提及sessionID的时候有两种方式。

(1)     cookies 方式,在session.use_trans_sid=0 and session.use_cookies = 1的情况下使用。这种方法是每次浏览器端点每个请求,都把sessionID发送到服务器。

(2)     url回写,session.use_only_cookies = 0 and session.use_trans_sid=1的情况下,服务器会忽略session.use_trans_sid,在浏览器发hhtp请求后,服务器会在返回页面内容中每个连接后面加上PHPSESSID=05dbfffd3453b7be02898fdca4fcd82b (在php.ini没改session.name,默认是PHPSESSID),这样就算客户端的浏览器禁止了cookies,一样能实现session功能。

这里来个测试:

在1.php文件代码:

  1. <?php  
  2.   
  3. echo 'Welcome to page #1<br/>';  
  4.   
  5. session_start();  
  6.   
  7. $_SESSION['favcolor'] = 'green';  
  8.   
  9. $_SESSION['animal']   = 'cat';  
  10.   
  11. $_SESSION['time']     = time();  
  12.   
  13.    
  14.   
  15. // Works if session cookie was accepted  
  16.   
  17. echo '<br /><a href="2.php">page 1 (这个href中没SID参数)</a><br/>';  
  18.   
  19.    
  20.   
  21. // Or maybe pass along the session id, if needed  
  22.   
  23. echo '<br /><a href="2.php?' . SID . '">page 2 (这个href中有SID参数)</a><br/>';  
  24.   
  25. ?>  

 

在2.php文件代码:

  1. <?php  
  2.   
  3. session_start();  
  4.   
  5.    
  6.   
  7. echo 'Welcome to page #2<br />';  
  8.   
  9.    
  10.   
  11. echo $_SESSION['favcolor'],'<br/>'// green  
  12.   
  13. echo $_SESSION['animal'],'<br/>';   // cat  
  14.   
  15. echo date('Y m d H:i:s', $_SESSION['time']),'<br/>';  
  16.   
  17.    
  18.   
  19. // You may want to use SID here, like we did in page1.php  
  20.   
  21. echo '<br /><a href="1.php">return page 1</a>';  
  22.   
  23. ?>   

情景1:没禁用浏览器的cookies(用cookies实现session),则在2.php能正常输出

情景2:禁用用浏览器的cookies且在php.ini开启session.use_trans_sid=1,通过1.php第一连接过去显示不了session的值,但第二个连接则正常显示。(说明url回写正常运行)





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值