Я уверен, что мы все работали или знаем о веб-приложениях (особенно на предприятии), которые тесно связаны с сеансом сервера. В этих случаях возможно, что сеанс будет поврежден, если открыто более одного сеанса браузера и используется один и тот же файл cookie сеанса сервера. Мы рассмотрели все варианты и обнаружили, что наилучшим способом продвижения вперед будет препятствовать использованию нескольких сеансов браузера, которые совместно используют файл cookie сеанса сервера.
Это действительно проблема, только когда пользователь выполняет New Window - Ctrl+N
в IE или эквивалент «дубликата табуляции» в других браузерах. По сути, мы получаем два активных сеанса браузера, которые используют одни и те же файлы cookie.
Итак, чтобы препятствовать этому (поскольку это, вероятно, будет непреднамеренным), я намеревался установить какую-то систему предупреждения для предотвращения такого поведения. Теперь наш код выполняет много проверок параллелизма, чтобы обеспечить целостность данных, но все еще могут быть проблемы с повреждением данных.
Мое решение после того, как я обнаружил, что общий ответ «невозможно», было положиться на AJAX для отправки «пингов» и измерения времени между ними. Итак, у нас есть общее правило: мы «пингуем» через определенный интервал, и если дельта между последним пингом в текущем пинге на меньше , чем длительность пинга, мы знаем, что у нас есть несколько активных сеансов браузера на один сеанс сервера.
Итак, где Pf
- частота пинга; Pc
- текущий пинг; и Pl
- последний пинг, тогда мы имеем ошибку, когда Pf > (Pc - Pl)
.
p1 p2 p3 p4
TAB1 0-----|-----|-----|-----|---...
: : :
: p1 : p2 : p3 p4
TAB2 0-----|-----|-----|-----|---...
^ ^ ^ ^ ^ ^ ^ ^
Deltas
----+---+------------
TAB | P | Delta (Pc - Pl)
----+---+------------
1 | 1 | 5
1 | 2 | 5
2 | 1 | 2.5 -Error
1 | 3 | 2.5 -Error
2 | 2 | 2.5 -Error
Теперь, если есть перегрузка сети или другие факторы, тогда дельта будет на больше , чем частота, исключая ложные срабатывания.
У нас есть проблема, если две вкладки открыты в один и тот же момент. Но, поскольку частота пинга - это только частота, с которой выполняются запросы, а не гарантированное истекшее время, мы можем предположить, что вскоре два сеанса браузера начнут проскальзывать синхронно.
В этом примере частота пинга установлена на каждые 5 секунд. Если одновременно существует 100 пользователей, мы смотрим ~ 20 запросов в секунду для ping Servlet / HttpModule. Чтобы минимизировать ненужный сетевой трафик, я думал, что частота пинга будет уменьшаться со временем, пока не будет достигнут максимум 20 пингов в секунду. Это будет составлять ~ 5 запросов в секунду при 100 одновременных пользователях. Это компромисс, однако, поскольку это приведет к задержке обнаружения. Однако, как только обнаружение происходит, частота сбрасывается до 5 пингов / секунду до разрешения. (Эти цифры приведены только в качестве примера; они будут различаться в зависимости от среды)
Чтобы свести к минимуму проблемы параллелизма и масштабируемости, отметка времени последнего пинга для сеанса должна храниться в самом сеансе. Это позволит любой технологии распределенного сеанса поддерживать доступность сеанса в JVM или доменах приложений, при этом наша служба ping не должна об этом знать.
Я пытаюсь определить, является ли это разумным подходом, если я нахожусь в мире боли. Любой опыт с проблемой будет полезен.
РЕДАКТИРОВАТЬ: Я знаю, что это звучит как лейкопластырь, но это должно быть мерой остановки, пока мы не сможем вырвать нарушающую библиотеку.