Как предупредить или предупредить пользователя, что сессия скоро истекает в php codeigniter - PullRequest
2 голосов
/ 11 мая 2010

В основном я ищу решение, где пользователь получает уведомление за пять минут до истечения сеанса.

Идеальным решением будет уведомление с обратным отсчетом, в котором будет возможность возобновить сеанс.

Если таймер обратного отсчета истекает без обновления страницы пользователем, мне нужно выйти из системы.

Ответы [ 4 ]

2 голосов
/ 11 мая 2010

Поскольку сессия будет обновлена, как только вы вернетесь назад на сервер и скрипт вызовет session_start (), вам действительно нужно сделать это в Javascript. Однако, если у пользователя есть два окна браузера, открытые с разделенным сеансом, и одно неактивно, в то время как пользователь все еще генерирует трафик с другим, тогда javascript в окне ожидания будет неверно сообщать о том, что сеанс скоро истечет. Таким образом, вам нужно реализовать свою собственную оболочку ajax для определения возраста сессии без вызова session_start ().

Что-то вроде:

 $session_id=$_REQUEST[session_name()];
 // if you use the default handler:
 $session_last_access=filemtime(session_save_path() . '/' . $session_id);
 $time_left=time() + session_cache_expire() - $session_last_access;

С

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

Добавлен этот скрипт в поле зрения: `

if(isSessionAlive >0)
{
    var timer = {
        time: 0,
        now: function(){ return (new Date()).getTime(); },
        start: function(){ this.time = this.now(); },
        since: function(){ return this.now()-this.time; }
    }
    var timerId;
    sess_expiration    = <?=($this->config->config["sess_expiration"]*1000)?>;
    alertTime    = <?=($this->config->config["sess_time_to_alert"])?>;
    timerId        = window.setTimeout("pingCI()",sess_expiration-((alertTime*1000)));
    jsBaseurl  =  "<?=($this->config->config["base_url"])?>";

}
function resetTimer(resetTime)
{
    //alert('RESET Time'+resetTime);
    window.clearTimeout(timerId);
    timerId = window.setTimeout("pingCI()", resetTime);
    return;
}
function pingCI()
{
    if(isSessionAlive > 0)
    {
            $.ajax({
                type: "POST",
                url: "<?= site_url('users/getSessionTimeLeft') ?>/",
                data: "sessid=<?=$this->session->userdata("session_id")?>",
                success: function(transport) 
                {
                    response = transport;

                    if(response=='')
                    {
                        parent.location.assign(jsBaseurl+'users/logout');
                    }
                    else if((response<=(alertTime*1000)) ||  (response-1000<=(alertTime*1000)))
                    {
                        alertSessionTimeOut(response);
                    }
                    else
                    {
                        resetTime = eval((response - alertTime)*1000);
                        resetTimer(resetTime);
                    }
                } 
            });
    }
}
function alertSessionTimeOut(alertTimeExp)
{
    if(isSessionAlive>0)
    {
        var response='';
        var timerIdEnd;

        timerAlert = window.setTimeout("forceLogout()",alertTimeExp*1000);
        timer.start(); // start counting my friend...


        fConfirm = confirm('Your Session is about to time out. Please click OK to continue the session');
        if(timer.since() >= (alertTime*1000))
        {
            parent.location.assign(jsBaseurl+'users/logout');
        }
        if(fConfirm ==true)
        {
                $.ajax({
                    type: "POST",
                    url: "<?= site_url('users/keepAlive') ?>/",
                    data: "sessid=<?=$this->session->userdata("session_id")?>",
                    success: function(transport) 
                    {
                        response = transport;
                        if(response=='')
                        {
                            parent.location.assign(jsBaseurl+'users/logout');
                        }
                        window.clearTimeout(timerAlert);
                        resetTimer(sess_expiration-((alertTime)*1000));
                    }
                });
        }
        else
        {
            //parent.location.assign(jsBaseurl+'users/logout');
            window.clearTimeout(timerAlert);
            window.clearTimeout(timerId);

        }
    }
}

function forceLogout()
{
    parent.location.assign(jsBaseurl+'users/logout');
} 

А в Users Controller:

   function getSessionTimeLeft()
   {
    $ci = & get_instance();
    $SessTimeLeft    = 0;
    $SessExpTime     = $ci->config->config["sess_expiration"];
    $CurrTime        = time();
    $lastActivity = $this->session->userdata['last_activity'];
    $SessTimeLeft = ($SessExpTime - ($CurrTime - $lastActivity))*1000;
    print $SessTimeLeft;
}

function keepAlive()
{
    $this->load->library('session');
    $this->session->set_userdata(array('last_activity'=>time()));
    if(isset($this->session->userdata["user_id"])) print 'ALIVE';
    else print  '';
} 

`

1 голос
/ 11 мая 2010

Зависит от того, что именно вы хотите достичь. Когда кто-то использует несколько вкладок / окон, окно может оставаться открытым очень долго без истечения сеанса. AJAX-операции еще более усложняют ситуацию. Если вы хотите получать точные уведомления, вам придется настроить таймер, а при его срабатывании проверить с помощью запроса AJAX (стараясь не возобновлять сеанс), является ли оценка по-прежнему точной.

0 голосов
/ 11 мая 2010
  1. Одним из способов является сохранение в одной переменной javascript оставшегося времени и обновление переменной при каждом обновлении страницы

  2. Создайте одну функцию javascript с одним заданным временем ожидания, которое проверяет значение переменной, установленной в 1.)

С уважением,
Pedro

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...