在我的经典ASP应用程序中,当客户端关闭浏览器时,与ASP会话ID相关的cookie会丢失,甚至认为会话没有超时。所以......
即使客户关闭浏览器,如何使ASP会话ID cookie保持不变?
答案 0 :(得分:5)
当您启动新的浏览器会话并浏览到您的站点时,经典ASP将检测到没有ASP会话cookie并将为您创建一个新会话(正如您已经体验过的那样)。
会话cookie就是这样,它们在会话的生命周期中存在。当您关闭浏览器时,会话cookie将被删除(即使您的服务器上的会话状态将作为孤立会话继续存在,直到Session.Timeout到期 - 除非您在Session.Timeout期间再次呈现相同的会话cookie)。
在新的浏览器会话/实例中延长ASP会话cookie生命周期的唯一方法是使用浏览器/客户端上的脚本更改cookie生存期。
如果您希望在浏览器关闭等事件中管理状态,则需要实现自己的状态管理机制(例如,将状态保持为数据库)并使用具有较长生命周期的常规cookie(或使用滑动到期,您可以在服务器端脚本中的每个请求上延长生命周期一小段时间)以使状态与用户匹配。
修改强>
以下文章有一个脚本来修改会话cookie(向下滚动到Cookie Expiration):
但正如Shoban正确指出存在Session Fixation (OWASP)的风险。但是,你可以采取某种方式来保护自己免受这种伤害:
如果您的应用程序存储敏感数据(信用卡,财务,医疗等),我还会添加一些注意事项,然后我建议您不要这样做,并认为您的用户必须再次登录并启动一个新的会议。比抱歉更安全。
答案 1 :(得分:1)
您可以增加会话时间。
Session.Timeout[=nMinutes]
http://www.asp101.com/articles/john/sessionsend/default.asp
<%
Response.Cookies("firstname")="Alex"
Response.Cookies("firstname").Expires=#May 10,2012#
%>
这不行吗?
答案 2 :(得分:1)
“会话cookie”是线索:当用户关闭浏览器时,他们正在结束会话。
服务器超时存在是因为服务器无法知道用户已结束会话,因此它的工作原理是,如果他们暂时不回来,会话必须结束。
如果你想要一个持久性cookie,你必须自己设置;但是没有办法阻止用户结束他们的会话。
答案 3 :(得分:0)
这不是设计的吗?
也许您想要使用普通的Cookie?
答案 4 :(得分:0)
您需要保留会话cookie,因为出于安全原因,您无法访问浏览器之间的会话(无论是两个不同的浏览器,还是关闭并重新打开的浏览器)。
通常,您将存储详细信息服务器端并使用包含简单ID的客户端cookie来检索信息。