我们的网站有20分钟的会话超时,我们的用户需要10分钟的会话到期警告。目前我们正在使用一个控件,它可以完成工作,但它不是AJAX意识的,所以即使用户一直在做东西也会弹出。
我有一个想法,只需每2分钟轮询一次服务器,找出用户离开会话的时间。但经过研究后我无法确定是否可以说“此请求不应刷新超时”,这对于轮询行为无意中刷新会话超时非常重要。
这可能吗,还是我错误的方式?
答案 0 :(得分:0)
如果您的会话有20分钟的固定到期时间,则刷新页面不会延长。但是,如果您希望在页面上有一个脚本来提醒用户即将到来的会话到期,那么您需要设置一个客户端脚本(假定Javascript)并在页面加载时启动它吗?
<script type="text/javascript">
function alertSessionTimeout(){ alert("Your session is about to expire. Please refresh the page.") }
window.setTimeout('alertSessionTimeout', 10*60*1000);
</script>
答案 1 :(得分:0)
我认为唯一可行的方法是修改你的ajax javascript以延长你现有脚本的超时时间。
您可以使用页面的禁用会话状态,然后修改您的应用程序以存储数据库中用户的上次访问时间。轮询无会话页面以找出用户上次做某事的时间。
无论哪种方式,您都必须在整个应用中进行大量更改。
答案 2 :(得分:0)
访问同一数据库的两个Web应用程序怎么样?在第一个,主应用程序,你写入数据库的最后访问时间,第二个应用程序通过ajax轮询,以获得上次访问时间的非活动时间...
答案 3 :(得分:0)
在轮询服务器时,您会看到剩下多长时间,您将重置为20分钟。您需要确保请求不附加会话cookie以防止这种情况发生。这样做会导致另一个问题,即您无法访问用户会话。
另一种方法是使用SetTimeout在JavaScript页面加载中执行。
答案 4 :(得分:0)
似乎有些人将会话状态与表单身份验证票证到期混淆。会话状态具有自动滑动到期 - 如果会话设置为20分钟,并且在与办公室中的朋友交谈19分钟后,您请求一个页面,则再获得20分钟。
答案 5 :(得分:0)
这是一个老问题,但我遇到了类似的问题并且有了解决方案的想法。
每次使用会话的页面请求时,您的会话都会刷新。进入应用程序缓存,输入key = sessionId和value = DateTime.Now。
创建一个不使用会话状态的Web服务(.ashx或你有什么),但理想情况下使用Forms Authentication或其他身份验证方案进行身份验证。您的javascript,即倒计时到会话到期的时间,将在会话到期前不久调用此Web服务,以查看会话是否真的将过期。
我认为如果会话过期,Web服务应返回类似于2的简单事件,如果会话即将到期则返回1,否则返回0。如果具有未知或无效的SessionId cookie的用户调用该服务,则返回随机[0,1,2] - 这有望阻止获得Forms Auth cookie的攻击者发现有效的sessionId。
我研究了反编译内置的SessionProvider,看看我是否可以在不触发刷新的情况下访问会话以发现过期。但这样做取决于所使用的会话提供程序的类型,因此如果您从SQL Server会话提供程序迁移到Redis,则必须重写它。