Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Завершение сеанса браузера

Сеансы и время их ожидания в книге при работе в браузере

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

В следующих разделах поясняется, что такое сеанс, каким образом он создается и завершается, а также к каким последствиям приводит истечение времени его ожидания.

В этой статье

Что такое сеанс

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

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

Как предотвратить истечение времени ожидания сеанса

Сеанс явно или неявно завершается (или прекращается), когда пользователь заканчивает его. Однако если пользователь не закончит сеанс, сервер может завершить его, если обнаружит отсутствие действий пользователя в течение определенного времени. Такое завершение сеанса называется истечением времени ожидания.

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

Как начать сеанс

Как правило, при открытии книги Excel сервер создает сеанс автоматически. Однако существует несколько способов начать сеанс.

Чтобы начать новый сеанс, выполните одно из следующих действий:

Откройте книгу в браузере.

Перезагрузите книгу. При этом закрывается текущий сеанс и создается новый.

Откройте страницу веб-части SharePoint, например панель мониторинга, содержащую веб-часть Excel Web Access.

Используйте подключение к веб-части SharePoint для передачи URL-адреса книги Excel. Можно сделать это, например, из веб-части представления списка библиотеки документов в веб-часть Excel Web Access.

Нажмите кнопку ОК или Применить в области инструментов веб-части для обновления свойства веб-части Excel Web Access.

Как завершить сеанс

Сеанс не завершается в результате нажатия кнопок Обновить, Назад или Вперед на панели инструментов Internet Explorer. Чтобы завершить текущий сеанс, выполните одно из следующих действий:

Дождитесь истечения времени ожидания сеанса.

Откройте книгу, содержащуюся в веб-части Excel Web Access, для которой включено свойство Закрывать текущий сеанс перед открытием нового сеанса.

Нажмите кнопку Справка на панели инструментов Excel Web Access при работе в режиме Навигатор.

Close/kill the session when the browser or tab is closed

Can somebody tell me how can I close/kill the session when the user closes the browser? I am using stateserver mode for my asp.net web app. The onbeforeunload method is not proper as it fires when user refreshes the page.

Создан 17 дек. 09 2009-12-17 13:54:16 Punit

9 ответов

You can’t. HTTP is a stateless protocol, so you can’t tell when a user has closed their browser or they are simply sitting there with an open browser window doing nothing.

That’s why sessions have a timeout — you can try and reduce the timeout in order to close inactive sessions faster, but this may cause legitimate users to have their session timeout early.

Создан 17 дек. 09 2009-12-17 14:00:35 Oded

facebook and gmail do it—anybody know how they achieve this? – NexusRex 29 июн. 11 2011-06-29 21:09:23

@NexusRex You can set a session cookie that expires when the browser is closed. That doesn’t expire the session server side, but the browser won’t have the token anymore. – Michael Stum 20 фев. 12 2012-02-20 09:28:30

As said, the browser doesn’t let the server know when it closes.

Still, there are some ways to achieve close to this behavior. You can put a small AJAX script in place that updates the server regularly that the browser is open. You should pair this with something that fires on actions made by the user, so you can time out an idle session as well as one that has closed out.

Создан 17 дек. 09 2009-12-17 14:04:11 Pete H.

As you said the event window.onbeforeunload fires when the users clicks on a link or refreshes the page, so it would not a good even to end a session.

http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx describes all situations where window.onbeforeonload is triggered. (IE)

Читать еще:  Коды переадресации андроид

However, you can place a JavaScript global variable on your pages to identify actions that should not trigger a logoff (by using an AJAX call from onbeforeonload, for example).

The script below relies on JQuery

This script may be included in all pages

Let’s go through this code:

A global variable is defined at page level. If this variable is not set to true then the event windows.onbeforeonload will terminate the session.

An event handler is attached to every link and form in the page to set this variable to true, thus preventing the session from being terminated if the user is just submitting a form or clicking on a link.

The session is terminated if the user closed the browser/tab or navigated away. In this case the global variable was not set to true and the script will do an AJAX call to whichever URL you want to end the session

This solution is server-side technology agnostic. It was not exaustively tested but it seems to work fine in my tests

Создан 31 дек. 09 2009-12-31 16:51:48 Daniel Melo

Important to note that you have to make it a *synchronous* Ajax request, or it’s extremely unlikely to get fired off at all. And of course, synchronous Ajax requests are ugly, they completely tie up the UI of the browser. – T.J. Crowder 31 май. 10 2010-05-31 17:19:28

@T.J. Crowder: ugly is an understatement when your server’s having problems and a typical response time is more than 5 seconds 🙂 – Andy E 31 май. 10 2010-05-31 17:41:48

Valid comments. How about a sync AJAX call with very small timeout?. Please consider that the proposed solution does not aim to resolve all the issues with orphans sessions. It would cover only a percent of them (user actively closes the browser and the logout URL responds ultra fast) – Daniel Melo 31 май. 10 2010-05-31 19:39:52

This will still incorrectly terminate the session if the user refreshes their page or navigates back/forwards using the browser back/forwards buttons. – Simon Lieschke 12 июн. 12 2012-06-12 01:56:58

I suggest you add: ‘//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) < validNavigation = true; >>’ like Saravanakumar [wrote](http://stackoverflow.com/questions/1921941/close-kill-the-session-when-the-browser-or-tab-is-closed/1922007#1922007) — it’ll prevent terminating session on refresh – BornToCode 21 янв. 15 2015-01-21 17:05:28

Using a ‘GET’ request to destroy a session? I think ‘DELETE’ or at least ‘POST’ would be a better fit. – scaryguy 12 июн. 15 2015-06-12 14:24:01

Cookie Expire при завершении сеанса браузера

Мои исследования показывают, что если я создаю файл cookie и не буду устанавливать дату истечения срока действия, он истечет, когда браузер будет закрыт.Cookie Expire при завершении сеанса браузера

Так что я создал печенье, как это:

Но когда я закрыть браузер и открыть его снова, следующее выражение равно верно:

Как я могу иметь печенье истекает когда сеанс браузера заканчивается?

Примечание: для моих целей использование статических данных вместо файла cookie кажется идеальным. Но я понимаю, что ASP.NET может перезагружаться по разным причинам, и это может вытащить ковер из-под текущего пользователя, если я потерял этот параметр.

вы хотите, чтобы куки на сервере истекают после завершения сеанса браузера ли? Как вы проверяете значение ‘Request.Cookies [« MyKey »]’ после закрытия браузера? – Stobor

Я хочу, чтобы файл cookie был на клиенте, а не на сервере. Я проверяю значение файла cookie после закрытия браузера при повторном открытии браузера и перезагрузке страницы. –

Любопытно, если в игре есть недокументированное значение по умолчанию — поместите точку останова на или после ‘Response.Cookies.Add’ и проверьте текущие значения установленного файла cookie, чтобы убедиться, что истечение установлено (или не установлено), как ожидалось. Кроме того, проверьте фактический файл cookie в своем браузере, чтобы убедиться, что срок годности установлен (или не установлен), как и ожидалось там. –

ответ

Он появляется вопрос, как описано Stober. Вы можете установить срок действия файла cookie в конце сеанса браузера, установив для свойства HttpCookie.Expires значение DateTime.MinDate или вообще не устанавливая свойство.

Тем не менее, по крайней мере, с настройками от Chrome-pick-where-you-left-off, похоже, что сеанс браузера не обязательно заканчивается при закрытии браузера. Когда он закрыт, а затем снова открывается, браузер Chrome забирает место, где он остановился, как будто сессия так и не закончилась. Это включает в себя продолжение использования файлов cookie, срок действия которых истекает в конце сеанса.

Читать еще:  Дополнение переводчик для яндекс браузера

Я пробовал использовать тот же код на FireFox. Закрытие и повторное открытие браузера привело к тому, что cookie истекает, как и ожидалось.

Так что, хотя есть некоторые общие правила, в конце концов это поведение полностью зависит от браузера.

Просто установите свойство Expires вашего экземпляра HttpCookie на номер DateTime.MinDate и истечет после окончания сеанса браузера.

Однако, это на самом деле не безопасный способ защиты что-то с печеньем, потому что печенье на самом деле действует навсегда. Это зависит от реализации клиента, если файлы cookie выбрасываются или нет. Если какой-то плохой человек перехватит ваши файлы cookie, у них будет доступ навсегда.

Установка даты истечения срока действия в ‘DataTime.MinDate’ имеет тот же эффект, что и установка даты истечения срока действия. В Chrome (по крайней мере, с некоторыми настройками) это означает, что cookie не истекает, когда сеанс браузера заканчивается. (Или, по крайней мере, «сеанс браузера» не заканчивается, когда браузер закрыт.) –

Вы можете поймать это на следующем мероприятии Session_start . Если у вас уже есть аутентифицированный пользователь сразу после начала нового сеанса, вы должны получить эту информацию из устаревшего файла cookie. Просто обнулите информацию о пользователе и позвольте переадресации входа позаботиться обо всем остальном.

Нечто подобное в global.asax.cs :

  • Код может несколько варьироваться в зависимости от того, как вы аутентификации пользователей

Сессии в PHP

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

Сеансы (sessions) позволяют разрешить эту проблему, обеспечивая поддержку данных между страницами на протяжении всего времени посещения пользователем вашего сайта. В рамках каждого сеанса могут быть задействованы многие переменные, которые будут храниться на протяжении всего сеанса. Сервер следит за сеансами пользователей, назначая им уникальные идентификаторы, которые генерируются сервером в момент открытия сеанса. Этот идентификатор называется идентификатором сеанса (session identifier) и должен передаваться на сервер каждый раз, когда после начала сеанса запрашивается очередная страница.

Рисунок ниже иллюстрирует порядок взаимодействий между браузером клиента и веб-сервером в рамках сеанса:

Информация о сеансах хранится на стороне сервера. Переменные сеанса сохраняются в файле, в сериализованном виде. Когда переменная сериализуется (преобразуется в последовательную форму), в файл записывается имя переменной, тип и значение в виде последовательной строки. В UNIX-подобных операционных системах этот файл обычно сохраняется в файловой системе /tmp (временная файловая система).

Интерпретатор PHP фактически не создает запись о сеансе, пока переменной сеанса не будет присвоено значение. Таким образом, при отсутствии каких-либо значений сеанс в действительности ничего не делает.

Браузер отправляет идентификатор сеанса на сервер всякий раз, когда запрашивает очередную страницу. Идентификатор сеанса может передаваться через cookie (как показано на схеме) или в виде параметра URL. По умолчанию идентификатор передается через cookie, но поскольку есть вероятность, что пользователь запретил использование cookie в настройках своего браузера, мы также рассмотрим возможность передачи идентификатора сеанса в строке URL.

Необходимость в использовании средств поддержки сеансов

Если бы все веб-сайты были предназначены лишь для того, чтобы передавать разные страницы различным пользователям, то фактически не нужно было бы вообще задумываться над тем, когда начинаются и оканчиваются сеансы. Тем не менее существует множество причин, по которым поддержка сеансов имеет большое значение:

  • К проекту сайта предъявляется требование, чтобы по мере прохождения пользователя от одной страницы к другой содержимое страниц, развертываемых в браузере, изменялось в зависимости от того, какие страницы уже посетил пользователь (или от количества просмотренных страниц).
  • Требуется, чтобы в окне браузера пользователя отображались рекламные объявления, но каждое конкретное объявление не должно появляться больше одного раза в течение каждого сеанса.
  • На протяжении сеанса необходимо накапливать информацию обо всех действиях, осуществляемых пользователем. Например, в приключенческой игре нужно следить за количеством выигранных очков и завоеванного оружия, а на сайте электронной коммерции — за наполнением тележки для покупок.
  • Необходимо в целом проследить за тем, как пользователи перемещаются по страницам сайта, например, узнать, как они обычно переходят на ту или иную внутреннюю страницу, — ставят на ней закладку или всегда проходят весь путь от начальной страницы?

Использование сеансов

Чтобы начать сеанс, нужно добавить в начало PHP-сценария вызов функции session_start() – лишь после этого появится возможность сохранять и получать данные, принадлежащие сеансу. Функцию session_start() следует вызвать до вызова функции header() и вообще до того, как браузеру клиента будет отправлена хоть какая-нибудь информация, в противном случае сеанс может работать некорректно.

Читать еще:  Почему не открывается вк в браузере

Обращение к переменным сеанса заключается в использовании суперглобальной переменной $_SESSION с подстановкой имени требуемой переменной в квадратных скобках. В примере ниже показан простой счетчик просмотра страницы за один сеанс (для простоты этот пример основан на обновлении одной и той же страницы несколько раз, однако, ни что не ограничивает вас в применении сеансов на нескольких страницах, но не забывайте добавлять на каждую из них вызов метода session_start()):

Завершение сеанса

Есть моменты, когда требуется преждевременно завершить сеанс. Например, если вы разместили на странице кнопку или гиперссылку выхода из системы. Выход из системы фактически означает завершение сеанса работы с пользователем. Завершают сеанс с помощью функции session_destroy(). Разумеется, сеанс предварительно должен быть открыт, чтобы было что завершать.

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

Результат работы сценария из примера приведен на рисунке:

При закрытии сеанса его данные удаляются из файлов на стороне сервера. Чтобы удалить переменные сеанса, необходимо присвоить пустой массив суперглобальной переменной $_SESSION.

Функции поддержки сеанса

Выше мы описали две наиболее часто используемые PHP-функции для работы с сеансами — session_start() и session_destroy(). В таблице ниже приведены остальные функции, относящиеся к сеансам, с описанием назначения каждой из них. Обратите внимание на то, что в некоторых случаях результаты выполнения рассматриваемых функций зависят от значений параметров конфигурации:

Общие сведения о функциях поддержки сеансов

Завершение сеанса при входе в систему [Часть 2]

В предыдущей статье Userinit.exe и “Завершение сеанса” при входе в систему мы рассматривали проблему на примере конкретного вируса, когда при включении компьютера вместо загрузки рабочего стола пользователь наблюдает завершение еще не начавшегося сеанса. С момента выхода статьи прошло не мало времени и можно констатировать факт, что на сегодняшний день существует множество вирусов, результатом действия которых является проблема «завершения сеанса». В большинстве случаев это происходит в результате действия так называемых винлокеров (WinLock) о которых я писал здесь. В данной статье хочу поделиться общими рекомендациями по восстановлению работоспособности системы в подобной ситуации.

Суть проблемы заключается в том, что вирусы подменяют ключи реестра и файлы, необходимые для инициализации пользователя и загрузки рабочего стола. Исправить первое и второе нам поможет практически любой загрузочный диск Reanimator LiveCD. Это автономная операционная система, которая загружается непосредственно с компакт диска (или флешки) и включает в себя комплект программ для работы с гостевым компьютером. В частности, нам понадобится редактор реестра. Скачать образ LiveCD можно с любого более-менее популярного торрент-трекера. Надеюсь, с записью образа на диск проблем также не должно возникнуть. Вероятно, напишу как это сделать в следующих статьях. Пока будем считать, что мы уже загрузились с LiveCD. Также нам понадобятся файлы: winlogon.exe, userinit.exe, logonui.exe, taskmgr.exe, explorer.exe. Их можно найти на установочном диске Windows или скопировать с другого компьютера, например на флешку.

Итак, приступим к восстановлению системы:

1. Файловым менеджером (Проводник, Total Commander, MidnightCommander, etc.) открываем диск «С:» и удаляем содержимое папки System Volume Information. В данной папке хранятся старые «снимки» системы с копиями системных файлов. Удалением содержимого мы исключаем возможность восстановления вредоносных программ, которые могли там сохраниться.

2. Удаляем из папки C:WINDOWSsystem32dllcache файлы (какие есть):

winlogon.exe
userinit.exe
logonui.exe
taskmgr.exe
explorer.exe

В данной папке Windows хранит копии системных файлов на случай сбоя системы, однако вирусы их могли подменить.

3. Необходимо перезаписать (с заменой) заранее подготовленные файлы:

С:WINDOWSsystem32winlogon.exe
C:WINDOWSsystem32userinit.exe
C:WINDOWSsystem32logonui.exe
C:WINDOWSsystem32taskmgr.exe
C:WINDOWSexplorer.exe

4. В меню «Пуск» находим редактор реестра (обычно в папке «Инструменты») и запускаем. В редакторе реестра переходим в раздел:

В правой части редактора находим следующие параметры:

Shell – щелкаем на нем два раза левой кнопкой мыши и откроется окно редактирования параметра, если отличается исправляем на – explorer.exe

UIHost – должен быть таким – logonui.exe

Userinit – должен быть таким – C:WindowsSystem32Userinit.exe, (с запятой).

VmApplet – должен быть таким – rundll32 shell32,Control_RunDLL «sysdm.cpl»

5. Переходим в раздел:

HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options

Находим и удаляем (если есть) подразделы: userinit.exe и explorer.exe

6. Переходим в раздел:

Если есть строковые параметры (REG_SZ): explorer.exe и userinit.exe — удаляем.

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

Ссылка на основную публикацию
Adblock
detector