| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > одна страничка на 1 браузер |
| Автор: seth 6.5.2008, 12:27 |
| Необходимо сделать так чтобы для 1 браузера можно было открыть лишь одну страничку (т.е. нельзя было в другом окне открыть ту же самую). Есть ли варианты решения проблемы? |
| Автор: almagnit 6.5.2008, 12:45 |
| Нет так сделать не получиться, JavaScript выполняется во время загрузки страницы, а для решения такой задачи необходима постоянная работа в фоновом режиме. |
| Автор: bars80080 6.5.2008, 12:53 |
| можно только в момент отсылки страницы, заводить лог по ip и другой инфо в БД, о том что пользователь открыл эту страницу. правда, его необходимо будет гасить спустя некоторое время автоматом. следовательно можно будет войти опять фоновый режим теоретически можно сделать с помощью ajax, но оно скорее всего муторно, да и трафик есть будет постоянно |
| Автор: ksnk 6.5.2008, 12:58 |
| seth, Установить куку и по таймауту поставить запрос какой-нибудь ерунды ajax'ом с сервера раз в 10 секунд. Если ерунда запрашивалась кем-то с такой кукой менее чем 10 секунд назад - сервер на запрос странички посылает клиента подальше... Итого - вторая страничка не будет открыта тем-же клиентом с включенными куками и разрешенным JavaScript. |
| Автор: almagnit 6.5.2008, 13:07 |
| Однако Аякс не удержит настойчивого пользователя и при желании можно будет открыть нужное кол-во копий. |
| Автор: almagnit 6.5.2008, 13:44 |
Вот именно, поэтому для решения подобных задач может стоит просто пересмотреть алгоритм работы и изменить его струтуру, в следствии чего данный вопрос отпадет сам по себе. В каких целях Вы преследуете использование этого способа ? |
| Автор: seth 6.5.2008, 20:01 |
| конкретизирую проблему - есть веб-приложение с багатым пользовательским интерфейсом (RIA на HTML). Все приложение умещается на одной страничке. (но там могут открыватся разные окна так что даже удобнее намного) и необходимо поддерживать обновления с сервера - т.е. если другой пользователь чето поменял то и в твоей вкладке должно изменится тоже. Для этого сделан пуллинг через ajax которые опрашивает обновления - но соответственно если открыть несколько вкладок то для аякс запросов используется одна и та же сессия - и следовательно обновления получает только 1 вкладка а для второй обновление не генерируется т.к. сервер думает что эта та же самая вкладка - вот собственно зачем необходимо какое то разделение или ограничение чтобы можно было открыть лишь один экземпляр приложения я уже думаю смотреть в сторону апплетов или флеша (но на флеше сложно что то придумать - т.к. не разбираюсь особо) |
| Автор: ksnk 6.5.2008, 23:40 |
И что? В аплетах или флеше есть возможнось запускать только один экземпляр апплета на броузер? Вариант №1 - запретить куки. Тогда идентификатор сессии будет передаваться в строке адреса и открытие нового окна (без дублирования уже открытой строки адреса) приведет к появлению новой сесии. Вариант №2 - хранить идентификатор сесcии не в куке, а в переменной JavaScript. При этом ввести новый запрос - "перегенерировать идентификатор сессии", который запускать автоматически при открытии страницы. Все ajax-запросы должны будут дополняться параметром ?PHPSESSID=?? При этом даже чистить сессионную куку не нужно, новая сессия "победит"... |
| Автор: seth 7.5.2008, 10:35 | ||
апплет можно подписать и уже использовать "стандартный механизм" проверки ;) (с использованием сокетсервера) Насчет варианта 1 - как отследить что пользователь открыл новую вкладку? Насчет варианта 2 - тоже самое - как отсделить - в этом жеж сама суть вопроса ;) |
| Автор: ksnk 7.5.2008, 10:42 |
никак. При таком решении это не обязательно ;-) Каждое окно получает новую сессию |
| Автор: seth 7.5.2008, 14:28 | ||
большинство браузеров если нажать открыть новую вкладку - автоматически туда все копируют (и адрес в том числе) - вот что меня и беспокоит ;) (например ИЕ 6) и то сомнительно что начнется новая сессия - я сейчас автоматически добавляю айди сессии - даже если куки включены - т.к. есть одна проблемная конфигурация в которой все плохо ;) |
| Автор: dstorm81 8.5.2008, 10:07 |
| seth конечно немного не в тему, но если это есть веб-приложение с багатым пользовательским интерфейсом (RIA на HTML). и специфика корпоративная заточенная под msie и винду то почему бы не попробовать использовать hta технологию позволяет создать окно без тулбаров и запуск ЕДИНСТВЕННОГО экземпляра программы и собственно встречный вопрос в чем собственно проблема то может заключаться при нескольких открытых табах пользователь ведь однозначно идентифицируется (ip, login+password) в системе со своими правами ну откроет он несколько табов, в них будет равнозначная информация, изменить в одном табе, обновится и в другом так что думаю что проблема немного надуманная по сути, имхо |
| Автор: seth 8.5.2008, 14:21 |
| приложение не только под винду ;) http://forum.vingrad.ru/forum/topic-209936.html# тут я уже писал что необходимо еще раз акцентирую внимание на том что обновление должно происходить _автоматически_ между двумя вкладками (равно как и между двумя браузерами) поэтому непонятно как необходимо определить передавал ты обновление этому пользователю или нет (но т.к. 2 вкладки работают под одной сессией то это сложно ;) ) Но вроде вариант который тут обсуждался вполне подходит - хранить например время открытия странички на стороне сервера (в сессии) и передавать его при каждом запросе от странички и сверять с тем что есть в сессии уже на стороне сервера можно рубить неправильные или сделать еще отдельные пулы для таких вкладок (и списков обновлений) - или открывать новую сессию (хотя я еще не пробовал работать из разных вкладок под разными сессиями - но наверное не получится) |
| Автор: dstorm81 8.5.2008, 14:44 |
| seth том что обновление должно происходить _автоматически_ между двумя вкладками (равно как и между двумя браузерами) 1 пользователь регистрируется в системе (заводится сессия на сего, или "дело", куку в браузер ему) 2 пользователь откывает страницу, вносит данные (здесь включается ajax забирает все и уносит в базу) 3 открывает такую же страницу - ему опять таки же все данные передаются из базы нашим ajax 4 если он пытается снова зарегится, то на сервер проверяется в системе он или нет то есть запустить другую сессию он не сможет, если конечно сессия не будет передаваться в урле так в чем проблема, ну открыл он несколько идентичных вкладок, ну будут данные туда передаваться ну в нес он данные в одну вкладку нажал на кнопку, отдал через ajax, перешел на другую вкладку идентичную у тебя там эти же данные подтянулись главное не передавать ид сессии в урле,тогда не сможет запустить другой браузер зачем в разных браузерах-то работать олдновременно, я егото понять не могу, ей богу посмотри на ajax чаты все идентично по сути... и никто не жалуется может быть конечно сумаществие но генерировать при загрузке страницы какую нить переменную и если пользователь зашел с нее, то брать ее как константку для запросов через ajax, пришел запрос а переменная не та, то все логаут, но это дурдом какойто |
| Автор: Ghirik 9.5.2008, 16:01 |
| Однозначно, нужно всё делать на стороне сервера. На вкладках любую активность превращать в запрос (в разумных пределах Ни о какой синхронизации между вкладками речь не может идти, только клиент-сервер сервер-клиент сервер-клиент(два, три, пять раз). Не следует заботится о неактивных вкладках/браузерах, при появлении активности обновляем данные. Я так не делал, но это просто. |
| Автор: seth 12.5.2008, 09:55 | ||||
| сессия в урле это стандарт если отключены куки насчет
т.е. несколько вкладок на 1 сессию? Добавлено @ 10:00
естественно синхронизация между вкладками осуществляется по схеме вкладка1->сервер->вкладка2...вкладкаН(либо другой браузер) вопрос еще раз повторюсь состоит в том как на пути сервер->вкладка2 передать обновления только вкладке2...вкладкеН, а не вкладке1 если они находятся в одной сессии |
| Автор: Ghirik 12.5.2008, 11:51 | ||||
Ага, сразу не понял...
Идентифицировать каждое окно/вкладку/браузер. ksnk, предложил идеальное решение - хранить идентификатор в переменной JavaScript-а. Вы будете точно знать сколько вкладок, окон, браузеров открыто у клиента. Что ещё нужно? Дело осталось за реализацией... При обмене с сервером, просто проверяете эту переменную перед обновлением данных. |
| Автор: seth 13.5.2008, 09:28 |
| собственно больше и ничего и не нужно ;) (где то я об этом уже писал ;) ) |