如何在 mvc 项目中同步这两个计时器

How do I synchronize these two timers in my mvc project?

本文关键字:计时器 两个 同步 mvc 项目      更新时间:2023-09-26

我的web.config中有这个会话过期时间,如果用户尝试使用HttpPost,它只会在过期时重定向,我猜它会在每个HttpPost之后重置计时器:

<system.web>
<sessionState mode="InProc" timeout="60" />
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" />
<authentication mode="Forms">
  <forms loginUrl="~/Login/Login"></forms>
</authentication>

我的 _Layout.cshtml 中有这个 javascript 代码,如果用户空闲,它会重新登录,我在这里疯狂猜测它会在 ajaxcall 后重置:

<script type="text/javascript">
    $(function () {
        var _redirectTimeout = 60 * 60 * 1000;
        var _redirectUrl = '@Url.Action("Logout", "Login")';
        var _redirectHandle = null;
        function resetRedirect() {
            if (_redirectHandle) clearTimeout(_redirectHandle);
            _redirectHandle = setTimeout(function () {
                window.location.href = _redirectUrl;
            }, _redirectTimeout);
        }
//EDIT1
$(document).ajaxComplete(function (event, request, settings) {
if(request.status === 403) {
   // reset timer
//resetRedirect();
 window.location.href = _redirectUrl; //Im a dumbass, It should be this but it still doesnt work...
}
});
        /*$.ajaxSetup({
            complete: function () {
                resetRedirect();
            }
        });*/ // reset idle redirect when an AJAX request completes
        resetRedirect(); // start idle redirect timer initially.
    });
</script>

这使我的两个计时器(都有 60 分钟(异步,知道我该如何解决这个问题吗?我想我应该使javascript与HttpPost同步,但我不知道如何...

编辑1 我用JesseJames的建议编辑了上面的java脚本代码,并尝试用下面的代码进行测试,但是resetRedirect((只是没有触发:

$('.save-table').on('click', function () {
                var tr = $(this).parents('tr:first');
                var PredefName = tr.find("#PredefName").val();
                var PredefDescription = tr.find("#PredefDescription").val();
                var PredefID = tr.find("#PredefID").html();
                tr.find("#lblPredefName").text(PredefName);
                tr.find("#lblPredefDescription").text(PredefDescription);
                tr.find('.edit-mode, .display-mode').toggle();
                $.ajax({
                    url: '/PredefinedViews/Update/',
                    data: JSON.stringify({ pID: PredefID, pName: PredefName, pDescript: PredefDescription }),
                    type: 'POST',
                    //dataType: "json",
                    contentType: 'application/json; charset=utf-8',
                    //success: function (data) {
                    //    alert(data);
                    //}
                    //error: function (response) {
                    //    alert(response.responseText);
                    //},
                });
            });

我什至尝试使用 ajaxError 而不是 ajaxComplete,但它仍然不起作用,有什么新建议吗?我也意识到我还应该在这个eqatuation中包含httpGet请求。

您可以处理每个 ajax 响应并检查其中是否有 401 代码,这意味着 - 未授权。然后重置计时器。

$(document).ajaxComplete(function (event, request, settings) {
   if(request.status === 401) {
       // reset timer
   }
});

您可以尝试处理其他 AJAX 事件:

JQuery 中的全局 ajax 事件处理程序

我的项目中的示例:

$(document).ready(function(){
    $(document).ajaxError(function (event, jqxhr, settings, exception) {
        if (jqxhr.status == 401) {
        }
    });
});

您可以处理每个 ajax 响应并检查其中是否有 403 代码 那是 - 未授权。如果未授权,则必须重置时间