2010-10-26 77 views
1

我需要整天保持会话吗?在会话到期之前或之前,如何在一天中执行会话而不会在IIS或web.config中给出任何会话超时?全天保持会话

注意:IIS中的默认会话超时 - 20分钟。

由于提前

+0

难道你不能只将会话超时设置为24小时吗? – CyberDude 2010-10-26 12:25:07

+0

为什么你不能在web.config中设置它? – 2010-10-26 12:27:25

+0

@Cyber​​Dude:这意味着会话在* last *请求后的24小时内在服务器上保持活动状态,并占用整个时间的资源。 – 2010-10-26 12:30:04

回答

1

您可以做的第一件事是通过使用SQL(或其他数据库)会话状态服务器将会话与流程分离,该会话状态服务器包含附加到会话标识的会话数据的序列化副本。然后,您可以使用持久cookie来回传递会话ID。任何到期的会话都可以重新生成或恢复。

既然你想整天保持一个会话(这天生就是不安全的),我们会假设大多数安全考虑已经被抛出。如果您担心重播攻击,您可以使用HMAC通过设置会话ID,日期时间,用户名(如果这是您的数据的一部分)来验证Cookie会话请求,也可以使用字符串中的IP地址,然后单向腌制这个数据的散列。通过这种方式,您可以重新哈希数据,并将与请求一起发送的哈希与来自该数据的生成的哈希进行比较,以查看请求是否有效。

+0

对于使用SQL而不是inProc来说,这将缓解大量会话同时打开的问题(在这种情况下听起来很可能) – 2010-10-26 12:57:02

1

强制页面被由JavaScript每隔10分钟左右刷新一次。会话超时后最后请求页面多长时间,会话变得无效。每隔10分钟刷新页面时,会话在每次刷新时都会延长20分钟。

+0

或者使用类似于Ajax的方法刷新页面的一部分*然后用户不会注意到回发。 – 2010-10-26 12:28:30

+0

这不会使浏览器关闭和维护会话。如果这不是要求,那么这很有用,但如果用户导航20分钟并返回,则会中断。 – 2010-10-26 12:28:39

+0

这不会保持会话24小时开放 - 它会无限期地执行(不是这里的要求) – 2010-10-26 13:02:08

0

如果您拒绝将web.config中的设置更改为更长的值,则可以尝试强制浏览器在会话超时的短时间内(例如17分钟)刷新。可能还有其他漂亮的方法。

如果你可以找到一个方法来做到没有这个会话,它会在以后节省你的痛苦。使用缓存策略(memcached)或查看资源使用情况。

例如你真的需要将X序列化到会话中吗?

0

使用StateServer而非是InProc

这代表所有的会话处理到一个单独的数据库,并从服务器的过程中删除。这样可以缓解服务器资源耗尽的问题,从而可以将会话超时增加到24小时。

我相信这是唯一可行的解​​决方案。

0

Peiter处于正确的轨道上 - 制造虚假的请求以保持活力。你绝对不想刷新页面,导致不需要的更新等。你甚至不需要刷新页面的一部分。您只需每隔X分钟发送一次ajax请求,而用户将浏览器打开到启用会话状态的IHttpHandler。这非常非常有效 - 我们有一个应用程序完全依赖会话来处理5分钟会话超时的任何事情。并且每4.5分钟发一次会话心跳。它已经投产3年多了,我们还没有失去一个会议。是的,在这种情况下会话状态被存储在进程中 - 会话的使用非常繁重,我们不希望等待他们出去使用SQL并返回。

PS:protip - 确保请求和响应唯一;否则在某些浏览器中缓存会导致此技巧无效。

0

把一个ajax调用放入一个定时器,一个不执行任何操作的方法“”,这就是即使用户在页面上但没有做任何事情意味着“完全不活动”,不会注销,我们已经实现了相同逻辑并解决了我们的问题,我们的目标是3到4个小时,并且我们不希望更改web.config中的值或因某些原因使用任何其他方式。

ajax调用将在“计时器”中,将计时器时间设置为“任何”。