Session`ın zaman aşımına girmesini engelleme

Session ın zaman aşımına girmesini engelleme

Bildiğiniz üzere, sitemizi ziyaret eden her kullanıcı için bir Session (Oturum) açılır.
Bu session bilgisi, eğer kullanıcı yeni bir sayfayı ziyaret etmezse belirli bir süre sonunda sona erer (timeout).

Bildiğiniz üzere, sitemizi ziyaret eden her kullanıcı için bir Session (Oturum) açılır. Bu session bilgisi, eğer kullanıcı yeni bir sayfayı ziyaret etmezse belirli bir süre sonunda sona erer (timeout).

Biz bu timeout süresini web.config içerisinden ayarlayabiliriz:

<configuration>
  <system.web>
    <sessionState timeout="20"></sessionState>
  </system.web>
</configuration>

Ancak, bazı durumlarda kullanıcının tarayıcı penceresini kendisi kapatmadan oturumun sona ermemesini isteyebiliriz. (Daha teknik bir ifadeyle, session'ın timeout'a düşmesini istemeyebiliriz.)

Bu durumda yapmamız gereken şey; belirli bir periyotla server bazlı kodumuzu çağıran (.aspx ya da .ashx) çağıran ufak bir javascript kodu eklemek.

Server bazlı kodumuz çağrıldığında session timeout sayacı sıfırlanır. Dolayısıyla session ımız hiç timeout a düşmez.

JS kodu:

<script type="text/javascript">
function KeepSessionAlive(){
    var rand = Math.floor((Math.random() * 100000000000) + 1);
    console.log('OK');
    var img = new Image(1,1);
    img.src = '/includes/KeepSessionAlive.aspx?' + rand;
}
window.setInterval(KeepSessionAlive,10000); 
</script>

Kodumuz her 10 sn de bir defa KeepSessionAlive adlı metodu çağırıyor. KeepSessionAlive metodunda ise hayali bir Image nesnesi oluşturulup resim kaynağı olarak bir .aspx dosyasını atıyoruz.

.aspx dosyasında ise şu kodları kullanabilirsiniz:

protected void Page_Load(object sender, EventArgs e)
{
    Response.ExpiresAbsolute = DateTime.Now.AddDays(-1.0);
    Response.Expires = -1;
    Response.CacheControl = "no-cache";
    Header.Controls.Add(new HtmlMeta { Name = "Cache-Control", Content = "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0, timeout=0, max=993" });
    Header.Controls.Add(new HtmlMeta { Name = "Pragma", Content = "no-cache" });
    Header.Controls.Add(new HtmlMeta { Name = "Expires", Content = DateTime.Now.AddMonths(-1).ToString("R") });
    Response.Cache.SetAllowResponseInBrowserHistory(false);
    Response.Cache.SetExpires(DateTime.Now.AddDays(-1.0));
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetNoStore();
}
Böylece asla sona ermeyen bir session ımız oldu.

Tabii siteye giren kullanıcı sayısı kadar server hafızasında yer işgali olacaktır. Dikkatli kullanmak lazım :)

Herkese iyi kodlamalar.