为了账号安全,请及时绑定邮箱和手机立即绑定

保持ASP.NET会话打开/激活

保持ASP.NET会话打开/激活

C#
aluckdog 2019-07-26 15:14:51
保持ASP.NET会话打开/激活只要用户打开浏览器窗口,哪种最简单、最不引人注意的方式可以使ASP.NET会话保持活动?它是定时的Ajax调用吗?我想防止以下情况:有时用户将窗口打开很长时间,然后输入一些内容,而提交则不再有效,因为服务器端会话过期了。我不想在服务器上增加超过10分钟的超时值,因为我希望关闭会话(通过关闭浏览器窗口)来快速超时。建议代码样本?
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

如果您正在使用ASP.NETMVC-您不需要额外的HTTP处理程序和web.config文件的一些修改。您所需要的只是在Home/公共控制器中添加一些简单的操作:

[HttpPost]public JsonResult KeepSessionAlive() {
    return new JsonResult {Data = "Success"};}

,编写一段类似于此的JavaScript代码(我已将其放入站点的一个JavaScript文件中):

var keepSessionAlive = false;var keepSessionAliveUrl = null;function SetupSessionUpdater(actionUrl) {
    keepSessionAliveUrl = actionUrl;
    var container = $("#body");
    container.mousemove(function () { keepSessionAlive = true; });
    container.keydown(function () { keepSessionAlive = true; });
    CheckToKeepSessionAlive();}function CheckToKeepSessionAlive() {
    setTimeout("KeepSessionAlive()", 300000);}function KeepSessionAlive() {
    if (keepSessionAlive && keepSessionAliveUrl != null) {
        $.ajax({
            type: "POST",
            url: keepSessionAliveUrl,
            success: function () { keepSessionAlive = false; }
        });
    }
    CheckToKeepSessionAlive();}

,并通过调用JavaScript函数初始化此功能:

SetupSessionUpdater('/Home/KeepSessionAlive');

请注意!我只为授权用户实现了此功能(在大多数情况下,没有理由让来宾保持会话状态),而保持会话状态活动的决定不仅基于-是否打开浏览器,而且授权用户必须在站点上进行一些活动(移动鼠标或键入某个键)。




查看完整回答
反对 回复 2019-07-27
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

每当您向服务器提出请求时,会话超时都会重置。因此,您只需对服务器上的空HTTP处理程序进行Ajax调用,但确保禁用处理程序的缓存,否则浏览器将缓存处理程序,不会发出新的请求。

KeepSessionAlive.ashx.cs

public class KeepSessionAlive : IHttpHandler, IRequiresSessionState
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            context.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
            context.Response.Cache.SetNoStore();
            context.Response.Cache.SetNoServerCaching();
        }
    }

.JS:

window.onload = function () {
        setInterval("KeepSessionAlive()", 60000)}

 function KeepSessionAlive() {
 url = "/KeepSessionAlive.ashx?";
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.open("GET", url, true);
        xmlHttp.send();
        }

@veggerby-不需要在会话中存储变量的开销。仅仅预先向服务器发送一个请求就足够了。



查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 404 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信