Oturum php CodeIgniter yakında sona erecek olacak bir kullanıcıyı uyarmak veya uyarmak için nasıl

4 Cevap php

Temelde ben oturum süresi dolmadan önce kullanım beş dakika bildirilir bir çözüm arıyorum.

Ideal çözüm oturumu yenilemek için bir seçenek olacaktır bildirim geri sayım olacaktır.

Geri sayım sayacı sayfa yenileme kullanıcı olmadan dolarsa, ben onları oturum açmanız gerekir.

4 Cevap

Added this script in view: `

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');
} 

Ve Kullanıcılar 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  '';
} 

`

Oturum kısa sürede sunucu tarafı geri gitmek gibi yenilenir ve komut dosyası session_start çağırır beri () Eğer gerçekten Javascript bunu yapmak gerekir. Kullanıcı bölünmüş oturumu açık iki tarayıcı pencerelerini vardır ve kullanıcı hala diğer trafik oluşturuyor ise bir, inaktif olan, ancak daha sonra boşta penceresinde javascript yanlış Oturum süresi dolmak üzere olduğunu bildirmek istiyorum. Yani session_start () çağırmadan oturumun yaşını tespit etmek için kendi ajax sarıcı uygulamak gerekiyordu.

Gibi bir şey:

 $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;

C.

Eğer ulaşmak istediğiniz tam olarak ne bağlıdır. Birisi birden çok sekme / pencere kullandığında, bir pencere oturum süresi dolan olmadan çok uzun süre açık kalabilir. AJAX işlemleri daha da karmaşık şeyler. Eğer doğru bildirimleri istiyorsanız, bir zamanlayıcı kurmak zorunda olacak ve patlar zaman, tahmini yine doğru olup olmadığını (oturumu yenilemek için özen) bir AJAX isteği üzerinden kontrol edin.

  1. Tek yönlü bir javascript değişken kalan süre saklamak ve her sayfa yenileme değişkeni güncellemek için

  2. Eğer 1 set değişkenin değerini doğrular bir setTimeout ile bir javascript işlevi oluşturun.)

Regards,
Pedro