在asp.net中处理会话超时的最佳方法是什么

时间:2010-07-22 12:42:26

标签: c# asp.net session-timeout

有多种方法可以处理会话超时,例如加载功能上的“元刷新”javascript。

我想要一些整洁的东西:超时前5分钟,警告用户......

我也在考虑在浏览器打开时保持会话开放(仍然需要弄清楚如何做到这一点......可能是一些带有刷新的iframe)。

你如何处理会话超时,你认为我应该进入哪个方向?

3 个答案:

答案 0 :(得分:3)

处理会话超时的最佳方法。

我说有两个基本案例 一个是用户输入很少或没有数据,只是阅读报告,或者用鼠标做小思考。在这种情况下,没有简单的方法通知他会话即将到期。如果要检查调用后面代码的会话剩余时间,则自动更新会话。然后,如果您有一个计时器来倒计时,那么用户可能已经打开了一个新的网页选项卡,会话将会过期但不是您用javascript注意的时间,并且用户收到错误的消息。

所以对我来说,当用户输入很少或没有数据时,只要让会话过期,如果他失去了一次点击,它会在以后再次进行。

其次是当用户需要输入许多数据时,某些时间可能需要一些时间,例如长文本,要编写并修复它。在这种情况下,我使用以下技术,我不会让会话结束。

如何在浏览器中保持会话打开。

这是一个非常好用且简单的技术,我使用的图像在会话超时之前使用JavaScript重新加载它。

<img id="keepAliveIMG" width="1" height="1" src="/img/ui/spacer.gif?" /> 

<script language="javascript" type="text/javascript"> 
    var myImg = document.getElementById("keepAliveIMG");

    if (myImg){
        window.setInterval(function(){
              myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());
            }, 6000);
    }   
</script> 

在第三种情况中,您可以执行此操作。我们关心会话是否仅在回发后过期。当用户输入一些数据并在帖子后面时,应用程序会将其重定向到登录页面并丢失帖子。

在第三种情况中,您可以捕获帖子数据并保存,直到用户重新登录。您可以在

上的global.asax上捕获帖子数据
protected void Application_AuthenticateRequest(Object sender, EventArgs e)

这是在重定向到登录页面之前调用的函数,在那里你看到你是否有发布数据和登录所需的用途,你将该帖子数据,ether保存到新的重定向页面,以太网到服务器(也许在会议上,可能在你的临时数据库上)。

现在用户再次登录后,您再次将其重定向到包含已保存帖子数据的最后一页,并且用户将继续保持原样。

这里唯一的技巧是创建一个中间页面,使用最后发布的数据和自动重定向的javascript调用来呈现表单。

答案 1 :(得分:1)

我唯一能想到的是在页面上生成一些创建客户端计时器的脚本,以便在接收和呈现页面时,它可以在X分钟后显示警报(即到期前5分钟)

如果您希望会话保持活动状态,则可以使用通过AJAX定期调用的通用处理程序(ASHX)来执行此操作。这将有助于刷新会话,只要AJAX调用继续,它就应该保持活动状态。

示例“keepalive.ASHX”:

<%@ WebHandler Language="C#" Class="keepalive" %>

using System;

public class keepalive : System.Web.IHttpHandler
{       
    public void ProcessRequest (System.Web.HttpContext context) 
    {
        context.Response.ContentType = "text/json";
        var thisUser = System.Web.Security.Membership.GetUser();

        if (thisUser != null)
            context.Response.Write("[{\"User\": \"" + thisUser.UserName + "\"}]");
    }

    public bool IsReusable
    {
        get { return false; }
    }
}

这是页面上用来调用它的脚本(简单来说就是jQuery):

<script type='text/javascript'>
    function keepAliveInterval()
    {
        $.ajax(
        {
            url: "keepalive.ashx",
            context: document.body,
            error: function () {
                alert("AJAX keepalive.ashx error :(");
            }
        });
    }

    $(document).ready(function () {
        window.setInterval('keepAliveInterval()', 60000);
    });
</script>

答案 2 :(得分:0)

使用一些jquery来关闭web.config中的会话超时变量。您可以使用this Jquery延迟技巧,当特定时间发生时(页面加载后x分钟),它会在x分钟内弹出一个div会话超时。很好,干净,非常简单。

关于会话超时,Codesleuth的ajax调用将是完美的。