![]() |
|
Модераторы: gambit |
![]()
|
|
| Mymik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1474 Регистрация: 12.5.2006 Где: Lamer-центер Репутация: 50 Всего: 78 |
Технология: asp.net 1.1
Пользователь залогинился и бродит по сайту, при логине я выставляю дату логина в базу. После этого пользователь уходит с сайта, или просто закрывает окно и браузер. Мне нужно как-то отловить это событие. возможно ли это сделать с помощью Session_End() ??? просто предыдущии разработчики засунули эту способность в Session_End(), а после обращаются к кукам пользователя (которого не существует после выхода) чтобы узнать его username. В принципе возможно это расчитывалось на то, что пользователь на связи(сессия умирает через каждые 20 минут). И погрешность в эти 20 минут не существенна... -------------------- |
|||
|
||||
| HUJG |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 10.1.2006 Репутация: нет Всего: нет |
IMHO никак. 100% отследить завершение сессии(завершения работы пользователя) можно только на сервере вызвав Session.Abandon(). В остальных случаях Session_End() будет вызываться по таймауту. А обращаться к кукам в Session_End() это бред конечно.
UPD Я тут подумал, а может и не бред конечно. Помоему куки тоже в сессии сохраняются. Это сообщение отредактировал(а) HUJG - 20.2.2007, 11:39 |
|||
|
||||
| catlion |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 20.2.2006 Где: Москва Репутация: 2 Всего: 2 |
Есть Javascript-события для обработки закрытия окна у эксплорера и gecko-движка. Насчет оперы не знаю.
НО они не являются частью стандарта, везде реализованы по-своему, довольно мутно. И кроме того, вам все-равно придется обрабатывать тайм-аут, так не проще ли с ним и работать, и не тратить время на всякие костыли? |
|||
|
||||
| Mymik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1474 Регистрация: 12.5.2006 Где: Lamer-центер Репутация: 50 Всего: 78 |
catlion, Насчет событие о закрытии окна я видел в инете... но там писали, что это признак плохого тона и типа не желательно это реализовывать...
Т.е. вы все же думаете, что погрешность в 20 минут (timeout session) вполне человечное действо :о). Или уменьшить его до 10 минут... -------------------- |
|||
|
||||
| catlion |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 20.2.2006 Где: Москва Репутация: 2 Всего: 2 |
Величину тайм-аута надо подбирать, исходя из характера сессий. Если есть форма на пару сотен полей, которую можно заполнять и 40 минут, это одно дело. А если юзер в среднем не проводит на странице больше 5 минут, как это обычно бывает - это дело другое.
Видимо, стоит держать максимально возможный тайм-аут, исходя из нагрузки на сервис и здравого смысла. |
|||
|
||||
| Mymik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1474 Регистрация: 12.5.2006 Где: Lamer-центер Репутация: 50 Всего: 78 |
я вот тут морочился сегодня с этим делом сегодня... Вобщем когда срабатывает событие Sessin_End() мы не можем взять не то что Cookie, мы даже HttpContext.Current не можем найти. Они все равны нулю :о(.
Так что я опознавал пользователя по Application. При каждом Application_AuthenticateRequest() я записываю в Application["Username"] данные HttpContext.Current.User.Identity Вроде как работает... Вот только закралось у меня подозрение :о). А эти данные, они случайно не общие для всех пользователей ??? Т.е. зашел пользователь Vasja он поставил свои Application["Username"] = "Vasja" а потом зашел пользователь Petja и он затер данные что оставил Vasja своими данными. И теперь и для Vasja и для Petja Application["Username"] = "Petja" ??? Если это так и есть, то помогите, ну как мне разграничить все эти данные ??? Я прям уже теряюсь, я уже засовывал в Application_AuthenticateRequest() запросы к базе и обновление времени прибывания пользователя на сайте... Но теперь проблема состоит в том, что заказчику по какой-то необъяснимой причине нужно и количество сессий выводить... Вобщем, как вы бы решили эту проблему ??? -------------------- |
|||
|
||||
| alir |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 383 Регистрация: 19.3.2005 Репутация: 1 Всего: 4 |
Mymik
Общие. Application работает в рамках всего приложения, а не сессии.
Дык просто юзать для этого Session. Если в рамках одной страницы, то ViewState. |
||||
|
|||||
| kedicik |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 12.4.2007 Репутация: нет Всего: нет |
Речь же идет о том когда сессия закончилась! Может создавать в Application не переменную(куда писать Васю) а список пользователей. И писать там и Васю и Петю как только отрабатывает Session_Start. А при завершении сессии находить своего Васю и уничтожать из списка
|
|||
|
||||
| Mymik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1474 Регистрация: 12.5.2006 Где: Lamer-центер Репутация: 50 Всего: 78 |
kedicik, Основная проблема состоит в том, что я не знаю чья сессия закончилась :о). Т.е. Session_End срабатывает только на сервере и к клиенту не имеет никакого отношения.
Так как мне надо было все это дело хранить в СУБД, ну и по этим же данным реализовывался запрет входа под одним логином с нескольких браузеров или компьютеров. То я просто проверял если последняя запись для этого пользователя с этими же данными отличается больше чем на 10 минут, то я создавал новую запись. Если же нет, то я делал update для этой записи... В принципе все это укладывалось в один запрос (благодаря Stored Procedure) потому особой нагрузке сервер не ощущает... -------------------- |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 34 Всего: 170 |
Забудьте про Application - это не для отдельного клиента объект. Только Session.
Размер сессии - константный. Кто-нибудь может пообещать, что клиент, после страницы с 40 полями (сессия на 40 мин) перейдет к странице с 2 полями (сессия 2 мин), а потом еще куда-нубудь? Клиент может ходить куда угодно и с каждым запросом то увеличивать, то уменьшать сессию, да еще для сотен/тысяч клиентов? Это что-то нездоровое, ИМХО. Mymik, я бы посоветовал юзать cookie клиента (SessionId). Правда не знаю как насет того, что я захочу с оперы и IE одновременно на твой сайт зайти, что будет, если IE поддерживает кукки, а в опере я их отключил? Но если ты проблему идентификации юзера решишь, то тогда все просто: в сам cookie и пиши дату последнего посещения. Или, если от куков нужно полностью отказаться, то пиши в базу, рядом с записью, время ее создания. По новому запросу считываешь, сравниваешь с временем на сервере и или создаешь новую запись, или юзаешь старую. Где писать время последнего посещения - фигня вопрос. Вопрос - однозначно идентифицировать юзера при его работе с несколькими браузерами. (Скажи клиенту, пусть банер повесит, если он такой крутой: "Поддерживается только IE с включенными куками" Может, я что-то не уловил, лучше будет если ты еще раз сформулируешь задачу. Это сообщение отредактировал(а) tol05 - 23.6.2007, 15:54 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| Mymik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1474 Регистрация: 12.5.2006 Где: Lamer-центер Репутация: 50 Всего: 78 |
Зайти на сайт то ты сможешь, но попасть в клиентские зоны ты не сможешь... т.е. анонимусом то ты можешь полазить по сайту, только там где это разрешено, а если залогиненый пользователь... то дули. Одна запись для одного человека. И да, храню в cookie данные опознавания пользователя, правда не SessionId, потому что я могу где-то случайно вызвать Session.Abandon() А храню значение Guid.NewGuid().ToString() ну и ключ к кукам тоже является Guid'ом... правда статическим. Ну а дальше передаем все это в SP, там делаем SELECT из базы по данному Guid, если там пусто, то создаем запись и проставляем GETDATE(), если же нет, тогда проверяем на разницу во времени ну и дальше опять условия и действия. Мне вот что больше интересно, а как ты будешь залить по сайту с большим количеством зон только для залогиненных клиентов без cookie... тебя туда попросту не пустят ;о). В конце то концов, логин храниться в Secure Cookie в asp.net'е... -------------------- |
|||
|
||||
| kedicik |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 12.4.2007 Репутация: нет Всего: нет |
У меня задача похожая в чем-то.
Ученик логинится и информация об этом заносится в бд - проставляется для этого ученика галочка что он начал тестирование. Это нужно для того, чтобы никто другой не вошел под ним с другого компа или с другого браузера. В конфиге сессия 20 мин. На окончание сессии галочка снимается. Это работает. Проблема в том, что, если он закрыл по ошибке браузер, а не вышел как нормальный человек по абандон, сессия будет висеть еще 20 мин. В конце концов галочка в бд снимется как только сееия закончится , но он уже в течение этих 20 мин не сможет опять начать тестирование. Тут конечно работало не так как надо - выводилось сообщение, что он должен обраться к преподу, чтобы тот снял галку и таким образом разрешил продолжить тестирование. Но это не совсем верно конечно, и не красиво. Что вы мне посоветуете? Другая ситуация - он прокурил эти 20 мин. А где-то был в середине тестирования. И вот он щелкает по кнопке в надежде что ответ его будет принят а на самом деле перенаправляется на страницу логина поскольку сессия закончилась. И тут я не могу отследить это и выдать ему --- ты долго спал! Я могу конечно проанализировать request.querystring и выяснить что на эту страницу он был перенаправлен системой. Но ведь это могло произойти и в любом другом случае. Что вы по этому поводу думаете? |
|||
|
||||
| kedicik |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 12.4.2007 Репутация: нет Всего: нет |
В общем мне придется хранить еще время в бд, когда ученик залогинился? чтобы решить эту проблему. А почему вы взяли именно 10 мин?
|
|||
|
||||
| Mymik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1474 Регистрация: 12.5.2006 Где: Lamer-центер Репутация: 50 Всего: 78 |
kedicik, если человек залогинился, то у него включены cookie, а следовательно ты можешь поставить и свои cookie.
Поставь cookie к примеру Guid.NewGuid().ToString() и поставь Expires у этого кука DateTim.MaxValue. Так ты сможешь отслеживать пользователей. При этом даже если человек на этом же компьютере, но в другом браузере он не сможет зайти и залогиниться под этим же login/password. Снятие галочки спустя 20 минут, как я понял, совершается в Session_End и в базе просто храниться последняя активация от пользователя... точнее дата активации его аккаунта и дата последнего его действия. И по ты проверяешь, мол если дата последнего действия больше GETDATE() на более чем 20 минут, то все, галоча снимается. А вот теперь если пользователь закрыл случайно браузер, и открывает после этого его, то у него все равно остаются cookie которые есть Guid.NewGuid().ToString() это не идентификатор пользователя, т.е. ему надо залогиниться, но при этом он сможет залогиниться, потому что идентификатор этой учетной записи совпали ;о). (проблема с закрытие браузера и открытие решена) (правда если пользователь закрыл браузер ушел, то сессия будет еще некоторое время висеть, но вот тут вот уже ничего не поделаешь)... Теперь вторая ситуация, когда он куряга (вообще надо будет ему еще выдавать сообщение, что надо меньше курить, потому что курение вредит здоровью человека (tol05, тебя это тоже касается, курить вредно, понял ??? :о) пепельница)) И опять таки, пускай сессия умерла и все остальное, но куки то у нас есть ;о) и по ним мы опять таки идентифицируем этого пользователя и матюкаемся на него, мол он такой подлец и тормоз по жизни :о). Но при этом надо быть очень осторожным. Нельзя спутать пользователей. Вот тут вот надо будет еще одно поле хранить в СУБД, это guid от этого пользователя, или id записи этого пользователя. Т.е. ты определяешь не только по Guid'у что храниться в браузере, но еще и по тому какой вообще пользователь там морозился. Вот так вот... вроде бы обе проблемы решены :о) Добавлено через 2 минуты и 9 секунд Для меня была кретичная точность моих вычислений... потому я взял 10 минут (погрешность в 10 минут для меня была допустима). В принципе можно все что хочешь брать. Просто 20 минут на самом деле очень долго... Добавлено через 7 минут и 22 секунды kedicik, но вообще, можно поступить очень и очень не красиво... повесить в body обработчик JS события onunload это событие возникает когда пользователь закрывает окно... И с это время отправить асинхронный запрос, которые сделает logout пользователя. но даже не знаю, если честно... просто событие это считается некрасивым тоном... но в данном случаи, думаю это сойдет с рук :о). -------------------- |
|||
|
||||
| kedicik |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 12.4.2007 Репутация: нет Всего: нет |
Я не знаю что такое Guid.NewGuid(). А про куки я думала конечно, но после этого у меня возникал вопрос а зачем я буду хранить в них информацию и какое время, если вдруг тут же за этот комп садится другой ученик. Да в Session_End в Global.asax В базе хранится не дата активации ученика, а дата для каждого теста, который он прошел. Если он просто вошел в систему тестирования но не тестировался , то дата нигде не хранится.
нет! Галочка снимается в Global.asax как я говорила
В БД у меня хранится вся информация об учениках и их идентификаторы. т.е могут проходить тестирование только ученики чьи ид есть в бд. И при входе ученика в систему я храню в сессии его ид, и использую его при переходе с одной стр на другую js знаю плохо. Добавлено через 4 минуты и 33 секунды
это типа ICallbackEventHandler ???????? |
||||||||
|
|||||||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Разработка под ASP.NET | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |