web-dev-qa-db-fra.com

Fermez / tuez la session lorsque le navigateur ou l'onglet est fermé

Quelqu'un peut-il me dire comment puis-je fermer/tuer la session lorsque l'utilisateur ferme le navigateur? J'utilise le mode Stateserver pour mon application Web asp.net. La méthode onbeforeunload n'est pas appropriée car elle se déclenche lorsque l'utilisateur actualise la page.

31
Punit

Tu ne peux pas. HTTP est un protocole sans état, vous ne pouvez donc pas savoir quand un utilisateur a fermé son navigateur ou s'il est simplement assis là avec une fenêtre de navigateur ouverte ne faisant rien.

C'est pourquoi les sessions ont un délai d'expiration - vous pouvez essayer de réduire le délai d'expiration afin de fermer plus rapidement les sessions inactives, mais cela peut amener les utilisateurs légitimes à avoir leur délai d'expiration de session plus tôt.

29
Oded

Comme dit précédemment, le navigateur n'informe pas le serveur de sa fermeture.

Pourtant, il existe des moyens de se rapprocher de ce comportement. Vous pouvez mettre en place un petit script AJAX qui met à jour le serveur régulièrement lorsque le navigateur est ouvert. Vous devez le coupler avec quelque chose qui se déclenche sur les actions effectuées par l'utilisateur, afin session inactive ainsi que celle qui s'est terminée.

7
Pete H.

Comme vous l'avez dit, la fenêtre d'événement.onbeforeunload se déclenche lorsque les utilisateurs cliquent sur un lien ou actualisent la page, il ne serait même pas utile de mettre fin à une session.

http://msdn.Microsoft.com/en-us/library/ms536907 (VS.85) .aspx décrit toutes les situations où window.onbeforeonload est déclenché. (C'EST À DIRE)

Cependant, vous pouvez placer une variable globale JavaScript sur vos pages pour identifier les actions qui ne doivent pas déclencher de déconnexion (en utilisant un appel AJAX depuis onbeforeonload, par exemple).

Le script ci-dessous repose sur JQuery

/*
* autoLogoff.js
*
* Every valid navigation (form submit, click on links) should
* set this variable to true.
*
* If it is left to false the page will try to invalidate the
* session via an AJAX call
*/
var validNavigation = false;

/*
* Invokes the servlet /endSession to invalidate the session.
* No HTML output is returned
*/
function endSession() {
   $.get("<whatever url will end your session>");
}

function wireUpEvents() {

  /*
  * For a list of events that triggers onbeforeunload on IE
  * check http://msdn.Microsoft.com/en-us/library/ms536907(VS.85).aspx
  */
  window.onbeforeunload = function() {
      if (!validNavigation) {
         endSession();
      }
  }

  // Attach the event click for all links in the page
  $("a").bind("click", function() {
     validNavigation = true;
  });

  // Attach the event submit for all forms in the page
  $("form").bind("submit", function() {
     validNavigation = true;
  });

}

// Wire up the events as soon as the DOM tree is ready
$(document).ready(function() {
    wireUpEvents();  
});

Ce script peut être inclus dans toutes les pages

<script type="text/javascript" src="js/autoLogoff.js"></script>

Passons en revue ce code:

  var validNavigation = false;

  window.onbeforeunload = function() {
      if (!validNavigation) {
         endSession();
      }
  }

  // Attach the event click for all links in the page
  $("a").bind("click", function() {
     validNavigation = true;
  });

  // Attach the event submit for all forms in the page
  $("form").bind("submit", function() {
     validNavigation = true;
  });

Une variable globale est définie au niveau de la page. Si cette variable n'est pas définie sur true, l'événement windows.onbeforeonload mettra fin à la session.

Un gestionnaire d'événements est attaché à chaque lien et formulaire de la page pour définir cette variable sur true, empêchant ainsi la session de se terminer si l'utilisateur soumet simplement un formulaire ou clique sur un lien.

function endSession() {
   $.get("<whatever url will end your session>");
}

La session se termine si l'utilisateur ferme le navigateur/l'onglet ou s'éloigne. Dans ce cas, la variable globale n'a pas été définie sur true et le script fera un appel AJAX à l'URL que vous souhaitez mettre fin à la session

Cette solution est indépendante de la technologie côté serveur. Il n'a pas été testé de manière exaustive mais il semble bien fonctionner dans mes tests

6
Daniel Melo

Veuillez vous référer aux étapes ci-dessous:

  1. Créez d'abord une page SessionClear.aspx et écrivez le code pour effacer la session
  2. Ajoutez ensuite le code JavaScript suivant dans votre page ou votre page maître:

    <script language="javascript" type="text/javascript">
        var isClose = false;
    
        //this code will handle the F5 or Ctrl+F5 key
        //need to handle more cases like ctrl+R whose codes are not listed here
        document.onkeydown = checkKeycode
        function checkKeycode(e) {
        var keycode;
        if (window.event)
        keycode = window.event.keyCode;
        else if (e)
        keycode = e.which;
        if(keycode == 116)
        {
        isClose = true;
        }
        }
        function somefunction()
        {
        isClose = true;
        }
    
        //<![CDATA[
    
            function bodyUnload() {
    
          if(!isClose)
          {
                  var request = GetRequest();
                  request.open("GET", "SessionClear.aspx", true);
                  request.send();
          }
            }
            function GetRequest() {
                var request = null;
                if (window.XMLHttpRequest) {
                    //incase of IE7,FF, Opera and Safari browser
                    request = new XMLHttpRequest();
                }
                else {
                    //for old browser like IE 6.x and IE 5.x
                    request = new ActiveXObject('MSXML2.XMLHTTP.3.0');
                }
                return request;
            } 
        //]]>
    </script>
    
  3. Ajoutez le code suivant dans la balise body de la page maître.

    <body onbeforeunload="bodyUnload();" onmousedown="somefunction()">
    
3
Saravanakumar

Pas parfait mais la meilleure solution pour l'instant:

var spcKey = false;
var hover = true;
var contextMenu = false;

function spc(e) {
    return ((e.altKey || e.ctrlKey || e.keyCode == 91 || e.keyCode==87) && e.keyCode!=82 && e.keyCode!=116);
}

$(document).hover(function () {
    hover = true;
    contextMenu = false;
    spcKey = false;
}, function () {
    hover = false;
}).keydown(function (e) {
    if (spc(e) == false) {
        hover = true;
        spcKey = false;
    }
    else {
        spcKey = true;
    }
}).keyup(function (e) {
    if (spc(e)) {
        spcKey = false;
    }
}).contextmenu(function (e) {
    contextMenu = true;
}).click(function () {
    hover = true;
    contextMenu = false;
});

window.addEventListener('focus', function () {
    spcKey = false;
});
window.addEventListener('blur', function () {
    hover = false;
});

window.onbeforeunload = function (e) {
    if ((hover == false || spcKey == true) && contextMenu==false) {
        window.setTimeout(goToLoginPage, 100);
        $.ajax({
            url: "/Account/Logoff",
            type: 'post',
            data: $("#logoutForm").serialize(),
        });
        return "Oturumunuz kapatıldı.";
    }
    return;
};

function goToLoginPage() {
    hover = true;
    spcKey = false;
    contextMenu = false;
    location.href = "/Account/Login";
}
3
teta47

Je le fais comme ça:

$(window).bind('unload', function () {
    if(event.clientY < 0) {  
        alert('Thank you for using this app.');
        endSession(); // here you can do what you want ...
    }  
    });
window.onbeforeunload = function () {
    $(window).unbind('unload');
    //If a string is returned, you automatically ask the 
    //user if he wants to logout or not...
    //return ''; //'beforeunload event'; 
    if (event.clientY < 0) {
        alert('Thank you for using this service.');
        endSession();
    }  
}  
3
Caveman

Pour fermer le navigateur, vous pouvez mettre le code ci-dessous dans votre web.config:

<system.web>
    <sessionState mode="InProc"></sessionState>
 </system.web>

Cela détruira votre session lorsque le navigateur sera fermé, mais cela ne fonctionnera pas pour la fermeture des onglets.

2
Arif

Il n'est pas possible de tuer la variable de session, lorsque la machine s'arrête inopinément en raison d'une panne de courant. Cela n'est possible que lorsque l'utilisateur est inactif pendant une longue période ou qu'il est correctement déconnecté.

2
gpa

Utilisez ceci:

 window.onbeforeunload = function () {
    if (!validNavigation) {
        endSession();
    }
}

jsfiddle

Empêchez F5, soumettez le formulaire, saisissez le clic et fermez/tuez la session lorsque le navigateur ou l'onglet est fermé, testé dans les navigateurs ie8 + et modernes, profitez-en!

1