【问题标题】:Warning and Extending User Session警告和延长用户会话
【发布时间】:2013-04-17 13:37:53
【问题描述】:

我对我的网站使用基本身份验证,当用户使用需要一段时间才能填写的表单时出现问题,他们的会话可能会结束,并且在单击“保存”后,工作将消失,因为他们的会话不再有效。

我尝试了以下方法:

在 web.config 中将会话超时设置为 1 分钟:

<system.web>
<sessionState timeout="1"></sessionState>

在我的页面中添加了以下 javascript,它应该每 30 秒延长一次会话:

AlertTimeOut = 30000; // Milliseconds, Alert Message       
WarnTimeOut = 30000; //  Warn Message before 30 sec of session out
setTimeout("WarnUser();", WarnTimeOut);
//setTimeout("AlertUser();", AlertTimeOut);
function AlertUser() {
    alert('Your session has been expired, please save your data outside the system [copy the data in word document].');
}
function WarnUser() {
    var currentTime = new Date()
    var hours = currentTime.getHours()
    var minutes = currentTime.getMinutes()
    if (minutes < 10) {
        minutes = "0" + minutes
    }
    if (hours > 11) {
        var tempTime = hours + ":" + minutes + "PM"
    } else {
        var tempTime = hours + ":" + minutes + "AM"
    }
    var ans = confirm("Your login session is about to expire in 5 minutes.Do you want to extend it? - Date: " + tempTime);

    if (ans) {
        var oImage = new Image;
        oImage.src = "tempdummy.gif" + Math.random();
        setTimeout("WarnUser();", WarnTimeOut);
    }
    else {
        setTimeout("AlertUser();", AlertTimeOut);
    }
}

这是我的 main.aspx.cs 页面的 sn-p,在等待 javascript 弹出 2 次后,我刷新页面,是的,session["userid"]null。我调试了 javascript,它确实像它应该的那样命中了每一行代码。

protected void Page_Load(object sender, EventArgs e)
    {

        if (Session["userid"] == null)
        {
           // the session is no longer valid, i guess the javascript didn't work :(
            //redirect user to an error page
        }
        else
         {
                username = (string)Session["userid"];
                // check user permission, and populate the form here
         }
     }

我在网上找到了一些使用类似代码的示例:

var oImage = new Image;
oImage.src = "tempdummy.gif" + Math.random();

延长会话,但我想我只是不明白它是如何工作的。这是我应该在我的aspx页面上某个地方的图像吗?它是如何工作的?因为它不适合我

---- || ---- || ---- || ---- || ---- || ---- || ---- ||

更新:

我还尝试了以下方法:

创建了一个 refresh_session.aspx 页面,其中只有 1 行代码:

protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write("success");
    }

然后我尝试发布到该页面以刷新视野(根据这篇文章:http://naspinski.net/post/Automatically-refresh-your-users-Session-behind-the-scenes-using-jQuery-and-AspNet.aspx

我更新的 javascript 看起来像:

    AlertTimeOut = 30000; // Milliseconds, Alert Message       
    WarnTimeOut = 30000; //  Warn Message before 30 sec of session out
    setTimeout("WarnUser();", WarnTimeOut);

    function TimedOut() {
        $.post("refresh_session.aspx", null,
        function (data) {
            if (data == "success") {
               setTimeout("TimedOut();", WarnTimeOut);
alert('refreshed');
            }
            else { alert('not refreshed'); }
        }
      );
    }

    function AlertUser() {
        alert('Your session has been expired, please save your data outside the system [copy the data in word document].');
    }
    function WarnUser() {

        var ans = confirm("Your login session is about to expire in 5 minutes.Do you want to extend it? ");

        if (ans) {
            var oImage = new Image;
            oImage.src = "tempdummy.gif";
            TimedOut() ;
            setTimeout("WarnUser();", WarnTimeOut);
        }
        else {
            setTimeout("AlertUser();", AlertTimeOut);
        }
    }

frefresh_session 中的断点被命中,但是当我刷新页面时,default.aspx 中的断点仍然为 NULL :((((((

【问题讨论】:

  • 您是否收到任何 javascript 错误?尝试在 firebug 中为 firefox 添加断点(或 chrome /IE 中的开发人员工具 -> 在浏览器中按 F12)。尝试找出是否发出了 post call 以及响应是否确实“成功”
  • 它在几次 Ctrl-F5 刷新后神奇地自行修复,它现在确实点击了 refresh_session.aspx 页面,但是当我再次刷新页面以在我的默认值中测试它时,会话仍然为空。 aspx :( 我很困惑

标签: c# javascript asp.net .net session


【解决方案1】:

这个想法是,每次用户在弹出窗口中单击“确定”时,您都会从网络服务器获取一个图像文件,从而延长会话。

您的网络服务器上有图片“tempdummy.gif”吗?

我还是对 sn-p 有点困惑:

var oImage = new Image;
oImage.src = "tempdummy.gif" + Math.random();

我不明白他们为什么在虚拟图像名称后面加上一个随机数。在尝试获取图像时,您可能会遇到 404。据我所知,进行导致 404 的 http 调用不会延长会话超时。

我会尝试从网络服务器获取一个真实的(非常小的)小图像,看看这是否能让您的会话保持打开状态。

【讨论】:

  • 我删除了 math.random() 并在我的服务器上添加了一个小图像的完整路径,但会话仍然没有刷新。
  • 我有点害怕,图像由静态文件处理程序提供。您可以尝试向网络服务器发出 ajax 请求并检查这是否会使您的会话保持活动状态
  • 我更新了我的回复。你能看看我做得对吗?它看起来不像 ajax POST 到达文件,因为我收到“未刷新”消息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 2012-02-08
  • 2016-04-02
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
相关资源
最近更新 更多