谁解释一下session的生命周期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁解释一下session的生命周期相关的知识,希望对你有一定的参考价值。

谁解释一下session的生命周期

session的生命周期是session会话域,打开一个浏览器请求一个网站的页面后,Session开始,当session超过时间限制(一般是30分种)后,session注销而失效 或是人为使用session.invalidate();使用session失效; 或是关闭浏览器后,session还存在,但是这里已经无法获取session了,过一会它还是失效。 参考技术A 因为不知道是什么编程语言,简单介绍一下session:
session简介
  Session直接翻译成中文比较困难,一般都译成时域。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间以及如果需要的话,可能还有一定的操作空间。
  具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。
  需要注意的是,一个Session的概念需要包括特定的客户端,特定的服务器端以及不中断的操作时间。A用户和C服务器建立连接时所处的Session同B用户和C服务器建立连接时所处的Session是两个不同的Session。
  session的工作原理
  (1)当一个session第一次被启用时,一个唯一的标识被存储与本地的cookie中。
  (2)首先使用session_star()函数,php从session仓库中加载已经存储的session变量
  (3) 当执行PHP脚本时,通过使用session_register()函数注册session变量
  (4)当PHP脚本执行结束时,未被销毁的session变量会自动被保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。
一、ASP的Session对象
其属性Timeout (读/写。整型)。为这个会话定义以分钟为单位的超时周期。如果用户在超时周期内没有进行刷新或请求一个网页,该会话结束。在各网页中根据
需要可以修改。缺省值是10min。在使用率高的站点上该时间应更短。
二、.net的session
在每次读取Session的值以前请务必先判断Session是否为空,否则很有可能出现“未将对象引用设置到对象的实例”的异常(出现这种异常原因之一就是session超时)。Session使用一种平滑超时的技术来控制何时销毁Session。默认情况下,Session 的超时时间(Timeout)是20分钟,用户保持连续20分钟不访问网站,则Session被收回,如果在这20分钟内用户又访问了一次页面,那么20 分钟就重新计时了,也就是说,这个超时是连续不访问的超时时间,而不是第一次访问后20分钟必过时。这个超时时间同样也可以通过调整Web.config 文件进行修改;在程序中进行设置:Session.Timeout = "30";
一旦Session超时,Session中的数据将被回收,如果再使用Session系统,将给你分配一个新的SessionID。
不过,你可别太相信Session的Timeout属性,如果你把它设置为24小时,则很难相信24小时之后用户的Session还在。Session是否存在,不仅仅依赖于Timeout属性,以下的情况都可能引起Session丢失(所谓丢失就是在超时以前原来的Session无效)。
三、在JSP中
  Jsp的session是使用bean的一个生存期限,一般为page,session意思是在这个用户没有离开网站之前一直有效,如果无法判断用户何时离开,一般依据系统设定,tomcat中设定为30分钟.
四、php中的session
在PHP开发中对比起Cookie,session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制;Session 能否像 Cookie 那样设置生存周期呢?有了 Session 是否就完全抛弃 Cookie 呢?我想说,结合 Cookie 来使用 session 才是最方便的。
如果客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时候扮演的是存储 Session ID 和 session 生存期的角色。
  我们来手动设置 session 的生存期:
  session_start();   // 保存一天
  $lifeTime = 24 * 3600;
  setcookie(session_name(),session_id(),time() + $lifeTime,"/");
  >
  其实 Session 还提供了一个函数 session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用:
  // 保存一天   <?php   $lifeTime = 24 * 3600;   session_set_cookie_params($lifeTime);   session_start();   $_session["admin"] = true;   >

ViewState Vs Session ...通过页面生命周期维护对象

【中文标题】ViewState Vs Session ...通过页面生命周期维护对象【英文标题】:ViewState Vs Session ... maintaining object through page lifecycle 【发布时间】:2011-02-22 09:54:28 【问题描述】:

谁能解释一下 ViewState 和 Session 的区别?

更具体地说,我想知道在页面的整个生命周期中保持对象可用(通过回发持续设置成员)的最佳方式。

我目前使用 Sessions 来执行此操作,但我不确定这是否是最好的方法。

例如:

SearchObject searchObject;
protected void Page_Load(object sender, EventArgs e)

     if(!IsPostBack)
     
         searchObject = new SearchObject();
         Session["searchObject"] = searchObject;
     
     else
     
         searchObject = (SearchObject)Session["searchObject"];
     

这允许我在页面上的任何其他位置使用我的 searchObject,但这有点麻烦,因为如果我更改任何属性等,我必须重置我的会话变量。

我认为必须有更好的方法来做到这一点,以便 .NET 不会在每次页面加载时重新实例化该对象,而是将其置于 Page 类的全局范围内?

【问题讨论】:

除了下面的答案之外,ViewState 要求存储的项目是可序列化的。否则,您将收到序列化异常。 【参考方案1】:

如果搜索对象的大小不是很大,则使用 ViewState。如果您只希望对象在当前页面的生命周期中存在,那么 ViewState 是完美的。

会话对象也可以使用,但很明显,一旦搜索对象在其中,页面的生命周期就会更长。

另外,我对 ViewState/Session 对象做的一件事是用一个属性包装它们的访问:

public object GetObject

    get
    
        return ViewState["MyObject"];
    
    set
    
        ViewState["MyObject"] = value;
    

我倾向于发现这样做更干净。只需更改上面的代码以满足您的需求。

Source 1

Source 2

【讨论】:

嗨,Jason,虽然感谢您对改进 Stack Overflow 内容的奉献精神,但有些人(包括我自己)对您最近从古老的问题中删除脏话的浪潮有些不满。这里有一些讨论:Let's clean up low-quality posts with profanity on Stack Overflow您的编辑波出现在 Meta 上,尽管问题是关于今天碰巧有同样想法的其他人:What if a user is searching and only removing profanity? 虽然我不能阻止您进行这些编辑,但如果您能够查看讨论并考虑避免系统地搜索这些内容,我将不胜感激。谢谢! 很公平。我只是觉得有这些话不合适。我不会再这样做了。 对不起,我不明白,为什么不总是 return ViewState["MyObject"]; ?检查的工作是什么。 @TPAKTOPA 是的,让NULL 检查是没有意义的。我已将其从代码示例中删除。谢谢:)【参考方案2】:

首先,Viewstate 是每个页面,因为会话在当前会话期间存在于整个应用程序中,如果您希望搜索对象在页面之间持续存在,那么会话是正确的方法。

第二个 Viewstate 在每次回发时都会在浏览器和服务器之间以加密文本的形式传输,因此您在 Viewstate 中存储的越多,每次从客户端返回和返回的数据就越多,而会话是存储在服务器端,唯一来回传输的是会话标识符,可以是 cookie,也可以是 URL。

会话或视图状态是否是存储搜索对象的正确位置取决于您对它执行的操作以及其中包含哪些数据,希望上述说明能帮助您确定正确的使用方法。

【讨论】:

【参考方案3】:

视图状态是特定于页面的,而会话状态是特定于浏览器的。您不能通过视图状态将数据从一个页面传递到另一个页面。但是您将使用会话状态。 每个会话都有一些唯一的ID,其中视图状态将数据存储在页面本身的隐藏字段中。会话将数据存储在服务器端,而视图状态数据存储在页面上,因此它使页面变得沉重并且应用程序变慢。 每个控件的视图状态默认为 true,它存储其状态(控件状态),我们可以通过使 enableviewstate=false 轻松启用或禁用它

【讨论】:

以上是关于谁解释一下session的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

SESSION和COOKIE的生命周期以及它们之间的关联

spring中bean的生命周期

session 生命周期

servlet生命周期已经session的生命周期

JAVA-JSP内置对象之session对象设置并获得session生命周期

JavaWeb关于session生命周期的几种设置方法