Каков наилучший подход для обработки тайм-аутов сессии в asp.net - PullRequest
4 голосов
/ 22 июля 2010

Существуют различные способы обработки тайм-аутов сессий, такие как «метаобновление» javascript в функциях загрузки и т. Д.

Я бы хотел что-то вроде аккуратного: за 5 минут до тайм-аута, предупредите пользователя ...

Я также планирую сохранить сессию открытой до тех пор, пока открыт браузер (хотя мне еще нужно выяснить, как это сделать ... возможно, какой-то iframe с обновлением).

Как вы справляетесь с тайм-аутами сессии и в каком направлении, по вашему мнению, мне следует идти?

Ответы [ 3 ]

3 голосов
/ 22 июля 2010

Лучший подход к обработке тайм-аутов сессий.

Я говорю, что есть 2 основных случая.
Один из них, когда пользователи вводят мало данных или не вводят данные, и просто читают отчетыили делать маленькие мысли мышкой.В этом случае нет простого способа сообщить ему, что сессия истекает.Если вы собираетесь проверить время, оставшееся до сеанса, вызывающего код, то вы автоматически обновите сеанс.Затем, если у вас есть таймер для обратного отсчета сеанса, то, возможно, пользователь открыл новую вкладку вашей сети, и срок сеанса истекает, но не в то время, когда у вас есть заметка с 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.

1 голос
/ 22 июля 2010

Единственное, о чем я могу подумать, - это создать на странице какой-нибудь скрипт, который создает клиентский таймер, чтобы при получении и визуализации страницы он мог показывать предупреждение через X минут (то есть за 5 минут до истечения срока действия)..

Если вы предпочитаете, чтобы сеанс просто поддерживал себя, вы можете сделать это с помощью универсального обработчика (ASHX), который вы периодически вызываете через AJAX.Это поможет обновить сеанс, и он должен оставаться в живых до тех пор, пока продолжаются вызовы 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>
0 голосов
/ 22 июля 2010

Используйте некоторые jquery, которые отключают вашу переменную тайм-аута сессии в web.config. Вы можете использовать этот трюк задержки Jquery, который, когда происходит определенное время (x количество минут после загрузки страницы), вызывает всплывающее окно сеанса с указанием времени ожидания в x минутах. Красиво, чисто и довольно просто.

Что касается времени ожидания сеанса, ajax-вызов Codesleuth был бы идеальным.

...