5

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

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

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

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

4

3 回答 3

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)

这是在重定向到登录页面之前调用的函数,在那里你会看到你是否有发布数据和登录所需的使用,你保存那个发布数据,以太到一个新的重定向页面,以太到服务器(也许在会话,可能在您的临时数据库上)。

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

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

于 2010-07-22T12:57:51.817 回答
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>
于 2010-07-22T12:48:22.350 回答
0

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

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

于 2010-07-22T14:04:55.317 回答