Закрыть / убить сеанс, когда браузер или вкладка закрыты - PullRequest
31 голосов
/ 17 декабря 2009

Может кто-нибудь сказать мне, как я могу закрыть / убить сеанс, когда пользователь закрывает браузер? Я использую режим сервера состояний для моего веб-приложения asp.net. Метод onbeforeunload неправильный, так как он запускается, когда пользователь обновляет страницу.

Ответы [ 9 ]

29 голосов
/ 17 декабря 2009

Вы не можете. HTTP - это протокол без сохранения состояния, поэтому вы не можете сказать, когда пользователь закрыл свой браузер или он просто сидит там с открытым окном браузера, ничего не делая.

Вот почему у сеансов есть тайм-аут - вы можете попытаться сократить тайм-аут, чтобы быстрее закрыть неактивные сеансы, но это может привести к тому, что законные пользователи будут иметь тайм-аут сеанса раньше.

7 голосов
/ 17 декабря 2009

Как уже было сказано, браузер не сообщает серверу, когда закрывается.

Тем не менее, есть несколько способов добиться близкого к этому поведения. Вы можете установить небольшой сценарий AJAX, который регулярно обновляет сервер, когда браузер открыт. Вы должны связать это с чем-то, что запускает действия, совершенные пользователем, чтобы вы могли тайм-аут неактивного сеанса, а также тот, который был закрыт.

6 голосов
/ 31 декабря 2009

Как вы сказали, событие window.onbeforeunload срабатывает, когда пользователь нажимает на ссылку или обновляет страницу, поэтому было бы нехорошо даже завершить сеанс.

http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx описывает все ситуации, когда срабатывает window.onbeforeonload. (IE)

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

Скрипт ниже основан на 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();  
});

Этот скрипт может быть включен на всех страницах

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

Давайте пройдемся по этому коду:

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

Глобальная переменная определяется на уровне страницы. Если для этой переменной не задано значение true, событие windows.onbeforeonload завершит сеанс.

Обработчик событий присоединяется к каждой ссылке и форме на странице, чтобы установить для этой переменной значение true, что предотвращает прерывание сеанса, если пользователь просто отправляет форму или щелкает ссылку.

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

Сеанс прекращается, если пользователь закрыл браузер / вкладку или удалился. В этом случае глобальной переменной не было присвоено значение true, и сценарий будет выполнять вызов AJAX для любого URL-адреса, который вы хотите завершить в сеансе

Это решение не зависит от серверных технологий. Это не было исчерпывающе проверено, но в моих тестах оно работает нормально

4 голосов
/ 25 июля 2016

Для закрытия браузера вы можете поместить следующий код в ваш web.config:

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

Он разрушит ваш сеанс при закрытии браузера, но не будет работать при закрытии вкладки.

3 голосов
/ 27 декабря 2015

Не идеальное, но лучшее решение на данный момент:

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 голосов
/ 22 сентября 2012

Пожалуйста, обратитесь ниже шаги:

  1. Сначала создайте страницу SessionClear.aspx и напишите код для очистки сессии
  2. Затем добавьте следующий код JavaScript на своей странице или главной странице:

    <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. Добавьте следующий код в тег body главной страницы.

    <body onbeforeunload="bodyUnload();" onmousedown="somefunction()">
    
3 голосов
/ 11 сентября 2012

Я делаю это так:

$(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();
    }  
}  
2 голосов
/ 11 сентября 2012

Невозможно уничтожить переменную сеанса, когда машина неожиданно выключается из-за сбоя питания. Это возможно только в том случае, если пользователь долгое время простаивает или правильно вышел из системы.

1 голос
/ 07 августа 2013

Используйте это:

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

jsfiddle

Запрет F5, отправка формы, нажатие ввода и закрытие / завершение сеанса при закрытии браузера или вкладки, протестировано в ie8 + и современных браузерах.

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