Подтвердить что ты не робот

Закрытие/завершение сеанса при закрытии браузера или вкладки

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ниже приведено script на 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 может быть включен во все страницы

<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, событие window.onbeforeonload завершит сеанс.

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

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

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

Это решение является агностиком на стороне сервера. Это не было exaustively испытано но оно кажется, что работает отлично в моих испытаниях

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

Пожалуйста, ознакомьтесь со следующими шагами:

  • Сначала создайте страницу SessionClear.aspx и напишите код для очистки сеанса
  • Затем добавьте следующий код 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>
    
  • Добавьте в тег тела главной страницы следующий код.

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

Ответ 9

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

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

jsfiddle

Предотвратить F5, отправить форму, ввести клик и закрыть/убить сеанс, когда браузер или вкладка закрыты, проверены в ie8 + и современных браузерах, наслаждайтесь!