理解ASP.Net会话的生命周期

6

我对ASP或ASP.Net会话的生命周期概念感到困惑。具体来说,我的困惑是:

  1. IIS如何决定何时开始新会话并结束现有会话?特别是当我们调用重定向代码时,IIS如何决定会话是继续还是结束?
  2. 我们如何设置会话过期时间?(目前我只知道通过web.config sessionState项进行设置。)
  3. 一个会话是否可以访问另一个会话的变量?
4个回答

5

会话通常通过在客户端机器上生成唯一标识符作为cookie来处理。这通常是一个会话cookie,因此您无法轻易地访问它。当您访问使用会话的网站时,它会查找此cookie。如果找不到它,它将创建一个新的cookie,从而创建一个新的会话。

设置过期时间的一种方法是在web.config中进行设置,您还可以通过转到网站属性 ->主目录选项卡 ->配置按钮 ->选项选项卡 ->会话超时,在IIS中进行设置。

您将无法访问其他人的会话数据。


1
如果您在web.config中设置了会话状态元素,则此功能将完全内置于asp.net(或asp)中,并且会自动发生:http://msdn.microsoft.com/en-us/library/h6bb9cz9(VS.80).aspx无法访问他人的会话数据是由会话处理方式保证的。所有数据都直接绑定到cookie中的唯一标识符。除非某人将别人的cookie复制到自己的计算机上,或者修改他们的cookie以使用别人的GUID,否则他们无法访问它。您不应该担心这两个问题。 - AaronS
1
  1. 即使您不使用它们,如果在web.config中设置了cookie,则该cookie仍将存在,您是正确的。
  2. 您的会话变量永远不会对另一个浏览器会话可用。如果您有要在会话之间保留的变量,应将它们放入具有过期日期的物理cookie中http://msdn.microsoft.com/en-us/library/ms178194.aspx。
  3. 会话时间基于服务器检测到任何活动的最后时间。如果用户继续使用它,会话将永久保持活动状态。
- AaronS
1
你的global.asax文件中有session_begin和session_end方法可供使用。我不确定是否有一种方法可以确定当前会话何时过期。您可能需要获取客户端发送页面的时间戳,并在其基础上添加20分钟或更长时间(如果您增加了它)。 - AaronS
1
1和3)我很久没有在经典 ASP 中工作了,但是我会像我在原帖中提到的那样,在 IIS 中设置您的会话超时。session_end 是 asp.net 特有的,我记不得经典 asp 是否有等效的内容了。我可能记错了。 2)原因是因为有两种类型的 cookies,会话 cookies 和物理 cookies。会话 cookies 仅存在于客户端机器的 RAM 中,并且不能作为物理 cookies 进行浏览。当用户关闭其浏览器时,所有会话 cookies 都会自动销毁。 - AaronS
1
在asp.net中,你可以这样做:if (Session.IsNewSession) Response.Redirect("login.aspx");但是,我相信在经典的asp中,你需要检查一下一个会话变量是否为null,然后手动重定向他们。 - AaronS
显示剩余9条评论

5
  1. 如果请求不包含会话cookie,或者它包含的会话cookie不再映射到会话,则会话开始。会话在以下情况下结束:a) 它在超时期内没有进一步请求参考它而变得空闲。b) 它被代码有意中止。c) 在处理过程终止时(例如应用程序被重新启动),进程内会话也将终止。

  2. 更改超时的不同方法基本上是通过修改web.config或从中继承值的配置文件来实现。

  3. 除非会话对象被有意地放置在其他会话可以访问的位置,否则不会出现这种情况。


太棒了!对于第1点,您说“1.会话启动是因为请求不包含会话cookie或它包含的会话cookie不再映射到会话” - 我困惑的是谁负责实现有关会话cookie的逻辑,是ASP.Net运行时吗?对于第3点,我认为您的意思是从不同的会话引用相同的对象实例,因此在一个会话中修改引用将影响在另一个会话中检索的值? - George2
1
ASP.NET运行时会为您处理所有的会话创建和Cookie创建。基本上,您可以(实际上不要这样做!!)维护一个静态的Dictionary<string,IHttpSessionState>,并在每个会话对象被创建时将其引用插入其中。使用自己发明的某些字符串键,然后可以让在一个会话中运行的代码访问另一个会话的会话对象。我想不出真正有意义的理由来做这件事,我相当确定这不会有好结果。 - AnthonyWJones
1
它将是Null。我会使用String.IsNullOrEmpty方法来测试它的值。 - AnthonyWJones
1
如果(!String.IsNullOrEmpty(Session["AmILoggedIn") { //关于未登录的操作 } - AnthonyWJones
@AnthonyWJones,在经典的ASP中有没有设置会话永不过期的方法? - George2
显示剩余3条评论

3

您可以使用以下代码程序性地设置会话超时时间:

Session.Timeout = 60; 

1

别忘了 AppPool 的设置...默认情况下(至少在 IIS 6 中),它会每隔 120 分钟回收一次。因此,有可能某个人的会话时间比设置的 Session_Timeout 值还要短。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接