【问题标题】:Why use post to keep session alive?为什么使用 post 来保持会话活跃?
【发布时间】:2016-05-27 15:14:50
【问题描述】:

我正在使用 C# MVC 开发一个 Web 应用程序,并使用 Session 在多个请求之间持久化数据。

有时会话超时,所以我想办法让它保持活力,并在 stackoverflow 中找到了一些解决方案。由于不愿意简单地将代码复制粘贴到我的项目中,我试图重写代码以满足我的需求并更好地理解它。

起初我尝试使用以下代码保持会话处于活动状态:

JS + jQuery - 客户端:

function keepAliveFunc(){
    setTimeout("keepAlive()", 300000);
};

function keepAlive() {
    $.get("/Account/KeepAlive", null, function () { keepAliveFunc(); });
};

$(keepAliveFunc());

C# - 服务器端:

[HttpGet]
public bool KeepAlive()
{
    return true;
}

然而,这似乎并没有让我的会话保持活跃,它正常过期。 经过一段时间的摆弄,我将代码更改为:

JS + jQuery - 客户端:

function keepAliveFunc(){
    setTimeout("keepAlive()", 10000);
};

function keepAlive() {
    $.post("/Account/KeepAlive", null, function () { keepAliveFunc(); });
};

$(keepAliveFunc());

C# - 服务器端:

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

后者运行良好,这让我得出的结论是,由于 POST 请求而不是 GET 请求,Session 保持活动状态。这就提出了一个问题:为什么在尝试保持会话活动时需要使用 POST?有什么不同?我是否犯了其他一些我不理解的错误?

我一直在寻找答案,但我似乎找不到任何关于这个问题的答案,只是没有太多解释的解决方案。阅读 MSDN 上的 Session 对我也没有多大帮助。这使我得出结论,有一些与 Session 相关的“单词”以及我尚未遇到的这个特殊问题,这使我无法有效地 google。

【问题讨论】:

  • 据我了解,会话保持活动的持续时间与允许会话 cookie 存活的时间直接相关。我很确定,对于您使用的任何框架,您都可以简单地配置会话超时持续时间并将其增加到您喜欢的任何值。会话超时的原因是安全相关的,因此不是技术限制,因此您可以配置它。如果您只是将会话 cookie 配置为更长的寿命,则无需显式 ping 服务器来刷新会话 cookie 的超时时间。

标签: c# jquery session


【解决方案1】:

无论是 GET 还是 POST,浏览器都会在请求中发送 SessionId cookie。因此,出于保持活动的目的,您使用哪一个并不重要。由于您和“ping”服务器的时间间隔不同,您很可能会看到行为上的差异。

对于 GET 请求,您以 300000 毫秒的间隔执行此操作,而对于 POST 请求,您以 10000 毫秒的间隔执行此操作。

很可能,您的服务器的会话寿命介于这两个值之间。 但是,您可以配置会话生命周期以满足您的需求(如增加它),但请记住,过期会话是一项安全功能,因此请尝试找到一个足够大的小值以让您的应用程序正常工作,但是仍然允许会话在安全的时间间隔内过期。

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多