【问题标题】:Detect if session expired using javascript使用javascript检测会话是否过期
【发布时间】:2010-07-22 10:21:10
【问题描述】:


我正在使用 ASP.Net 创建一个 Web 应用程序。我在我的应用程序中使用会话。
在一种情况下,我试图通过 Javascript 访问会话变量。当我在正常状态下访问它时,它工作正常。但是在会话到期后,如果点击任何按钮,它会抛出异常并表现异常,导致找不到页面。
这是我正在使用的代码;

 var TransactionID = '<% =((Hashtable)(Session["SessionData"]))["TransactionID "] %>';
 if(TransactionID !='')
 {
    //action
 }

我正在尝试在 c# 中实现类似的东西;

String lsStr;
if(null != lsStr)
{
    //action
}

如果有人知道如何使用 javascript 检查会话是否存在,请帮助我。
提前致谢。

【问题讨论】:

  • 嗯。最安全的方法是向服务器发送一个快速的 Ajax 请求,告诉您会话是否仍然处于活动状态。但也应该可以在 JavaScript 端使用计时器。
  • 但不会发送 ajax 保持会话活动?
  • @TheVillageidiot 您应该能够根据需要设置会话,因此您可以使某些 AJAX 调用不保持会话活动,并且只有基于用户操作的调用才能这样做

标签: javascript asp.net session-timeout


【解决方案1】:

我会在您的代码隐藏页面中推荐一个公共属性:

public string TransactionID
{
   get { 
        var data = ((Hashtable)(Session["SessionData"])); 
        if (data != null)
           return data["TransactionID "];
        else
           return null;
   }
}

绕过直接错误。如果您希望轮询机制知道何时过期,请考虑 JS 计时器倒计时/AJAX 调用服务器的想法。如果不向服务器请求信息,就无法从客户端检查会话。

但是,使用上面的属性,当页面回发时,并且在客户端,事务 ID JS 变量将为空,这将是一种识别会话也过期的方法。

HTH。

【讨论】:

  • 谢谢布赖恩 :) 我在考虑 hiddenVariable。这样,就不需要访问属性后面的代码。使用隐藏变量安全吗?
  • 隐藏变量直接呈现在屏幕上。如果您希望交易 ID 具有隐私性,隐藏变量并不安全,但为了使其安全,您可以加密密钥并将加密值存储在那里。
【解决方案2】:

将此检查置于计时器客户端的建议会在每次运行时延长会话,从而导致会话永不过期,仅当这是所需的功能时才这样做。

最好的办法是仅在需要时执行检查,方法是向不需要身份验证的页面发出 ajax 请求,然后该页面可以测试某个会话变量是否存在并返回 true 或 false。

例如,我最近处理的一个应用程序有一个带有客户端逻辑的页面,需要检查以确保会话仍然存在。在这种情况下,对于该页面,我知道用户 ID 始终存储在 Session["UserID"] 中,因此我创建了一个 c# ajax 页面,如果该对象为 null,则返回 false,如果存在则返回 true,这允许我从 JavaScript 调用此页面并告诉会话是否已过期。这可能需要进行一些更改以适应您的情况,但我相信您可以使用相同的逻辑来做一些事情。

【讨论】:

    猜你喜欢
    • 2013-05-25
    • 2017-05-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2014-10-15
    相关资源
    最近更新 更多