Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как определить, что Сессия истекла (по времени) и вывести предупреждение?
Форумы портала PHP.SU » » Вопросы новичков » Как определить, что Сессия истекла (по времени) и вывести предупреждение?

Страниц (1): [1]
 

1. LShark - 22 Февраля, 2013 - 18:56:33 - перейти к сообщению
Выставлено ограничение сессии по времени в 2 часа.
Как только она истекает, происходит автоматический разлогин юзера.

Однако есть люди, мягко говоря, медленно думающие и работающие, поэтому они с перерывами могут занудно долго набирать текст в форму и ткнуть "Далее" через 2,5 часа после начала сессии. И тогда вместо размещения их неэпического труда сайт выкидывает им окошко логина.
Груда кирпичей, повторный логин и снова набор текста.

Где то на сайте видел, что если долго сидишь и сессия разрегистрировалась, то выводится предупреждение об этом. Но вот забыл где. Просто ушел на дело, вернулся -висит сообщение про разлогин.

Как это сделать? Не ставить же тупо джаваскрипт счетчик времени и после истечения выводить предупреждение?
2. NoPaper - 22 Февраля, 2013 - 19:00:10 - перейти к сообщению
LShark пишет:
Не ставить же тупо джаваскрипт счетчик времени и после истечения выводить предупреждение?

Ну почему же тупо? Таймер на минуту, ajax'ом обращаться к скрипту, проверять на наличие сессии.

Вариант 2. Опять таймер. Но только уже не обращаться к серверу, а проверять куки на 'живучесть', т.е. сравнивать expires сессии и текущее время.
3. LShark - 22 Февраля, 2013 - 21:26:02 - перейти к сообщению
Хм... логично.
Просто под "тупо" я подразумевал просто джаваскриптовский отсчет 2 часов с момента "начала" работы и выведение сообщения, как только 2 часа миновало. Безо всяких запросов.

Но этот вариант не катит, если работать в 2 окна - в одном напишет, что все уже, а во втором сессия будет активна и ее время не истечет.
4. DeepVarvar - 22 Февраля, 2013 - 22:46:12 - перейти к сообщению
Мне кажется у вас тут попахивает легким бредком.
Вот смысл:
PHP:
скопировать код в буфер обмена
  1. $member = array(
  2.   "id"=>null,
  3.   "name"=>"Гость",
  4.   "lastname"=>null,
  5.   "hash"=>null
  6. );
  7.  
  8. if (isset($_SESSION['member'])) {
  9.   $member = $_SESSION['member'];
  10.   setcookie("member", $member['hash'], 86400, "/");
  11. } else if (isset($_GET['logout'])) {
  12.     unset($_SESSION['member']);
  13.     setcookie("member", "", -1, "/");
  14.     header("Location: /кудатотам");
  15.     exit();
  16.   }
  17. } else if (isset($_POST['login'])) {
  18.   if ($getMember = "попытка получить юзера по форме входа") {
  19.     $member = $_SESSION['member'] = $getMember;
  20.     setcookie("member", $member['hash'], 86400, "/");
  21.     header("Location: /кудатотам");
  22.     exit();
  23.   }
  24. } else if (isset($_COOKIE['member'])) {
  25.   if ($checkMember = "попытка получить юзера по хешу из БД") {
  26.     $member = $_SESSION['member'] = $checkMember;
  27.     setcookie("member", $member['hash'], 86400, "/");
  28.   }
  29. }
5. vanicon - 22 Февраля, 2013 - 23:32:23 - перейти к сообщению
LShark пишет:
Но этот вариант не катит, если работать в 2 окна - в одном напишет, что все уже, а во втором сессия будет активна и ее время не истечет.

Такой же отсчет времени, только отсчитываешь время считав его с сервера.
Поясню:
в сессию загоняешь время авторизации
и при загрузке страницы от этого времени и отсчитываешь
6. DeepVarvar - 23 Февраля, 2013 - 00:07:52 - перейти к сообщению
vanicon пишет:
в сессию загоняешь время авторизации
И тут сессия кончается.. А? Что?? Где???
7. vanicon - 23 Февраля, 2013 - 00:51:04 - перейти к сообщению
DeepVarvar пишет:
И тут сессия кончается..

Вы меня не поняли, я имел ввиду при авторизации пользователя сохранять в сессии текущий time....
8. DeepVarvar - 23 Февраля, 2013 - 06:17:20 - перейти к сообщению
vanicon пишет:
и при загрузке страницы от этого времени и отсчитываешь
Я прекрасно понял, а вот вы - нет. Страницу то никто не загружает..
А уборщик уже прошел, файлики сессий потер.. Смысл хранить то что профукают?
9. LShark - 23 Февраля, 2013 - 08:25:33 - перейти к сообщению
Проблема то вот в чем:
1. Пока ТЮ (тупой/тормозной юзер) бродит по конторе/пьет чай/подвергается орально-анальному воздействию у начальства или вообще ушел домой, на его компе, естественно, висит открытая страница (а в случае с Оперой - даже если страница закрыта, но не разлогинена, то сессия продолжает в ней висеть, если сама Опера не закрывалась).
2. Приходит ХЖП (хитрожопый поганец) и от имени ТЮ делает всякую пакость. Далее по логам ТЮ получает люлей вместо ХЖП.

Для этого сделан разлогин по времени. Это не спасет, конечно, полностью, но уменьшит риск.

Но вот продолжение пункта 1.
3. ТЮ (а чаще всего это лурковская ТП) приходит и продолжает то, что она набирала "вчера" (да, такой прикол тоже встречается - оставляют включенными комп, чтобы завтра добрать и отправить, свет вырубают редко).
4. Тык "Далее" - и на экране радостное сообщение, что надо залогиниться. Груда кирпичей и все такое.

Поэтому ДВЕ задачи:
1. НЕЛЬЗЯ автоматически воссоздавать сессию, если разлогин УЖЕ произошел (чтобы ХЖП не смог продолжить работать под аккаунтом ТЮ), если эта ТП оставила окно открытым или Оперу незакрытой.
2. Необходимо, чтобы когда сессия потерлась на сервере, у юзера выпадало окно-предупреждение, возможно с окном Логина, так как после Логина во втором окне (по крайней мере в Опере) данные из первого окна уйдут уже по новой сессии. Или просто предупреждение - типа скопируй, хотя бы, и перелогинься.
10. vanicon - 23 Февраля, 2013 - 11:21:01 - перейти к сообщению
Что - то я все еще не могу понять почему мой вариант решения не подойдет.
Распишу все подробнее, так сказать весь процесс:
1. Пользователь входит в систему, в сессию записывается текущий time...
2. Пользователь переходит на страницу добавления статьи (или чего -то там) и со стороны сервера смотрится этот записанный time, есть он есть то передаем его javascript(то есть клиенту) для отсчета времени, если его нет то то сразу перекидываем его на страницу авторизации..
3. На клиенте просто идет отсчет определенного времени (2 часа например), и как 2 часа прошло то может выскакивать окно, или еще что-то там.
А сервер через 2 часа может сам почистить сессии и т.д
Надеюсь я все доступно написал...
(Добавление)
И это был первый вариант.
Вот второй:
Можно через каждые 10 минут сохранять статью в черновик, многие cms так делают...
А если например сохранить не удалось, потому что тупо сессия кончилась, то можно и сообщение выдать....
11. Мелкий - 23 Февраля, 2013 - 11:30:15 - перейти к сообщению
LShark пишет:
и на экране радостное сообщение, что надо залогиниться

Что мешает стартовать сессию, записать туда все пришедшие данные, и попросить залогиниться?
После авторизации выполнить запрос или воскресить форму со всеми данными.

LShark пишет:
Для этого сделан разлогин по времени.

Для этого сделана блокировка экрана. Если юзер не понимает, для чего она - делается безобидная гадостная гадость, пока отошёл. И юзер понимает, для чего это.

 

Powered by ExBB FM 1.0 RC1