Как избежать совместного использования сеанса, предоставляемого IE8 программно в приложении Java EE? - PullRequest
7 голосов
/ 03 июня 2010

Microsoft, стремясь сделать Internet Explorer 8 «более стабильным» и «более быстрым», изменила базовую архитектуру браузера и представила функцию под названием «Слабосвязанная IE» (LCIE), которая работает над совместным использованием сеансов через TAB и новые экземпляры.

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

ВЕРОЯТНОЕ РЕШЕНИЕ НА ЭТОМ

  1. При создании нового окна вместо создания нажатием на значок или Ctrl + N, мы должны использовать File -> New Session; этого не произойдет.

  2. Вы можете внести изменения в реестр на клиентском ПК - добавив следующее.

    [HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Internet Explorer \ Main]

«TabProcGrowth» = dword: 00000000

Отключит "Loosely Couple IE8"; IE8 тогда работает как предыдущие версии IE.

  1. Запуск MSIE с использованием iexplore.exe -nomerge отключит «Loosely Couple IE8»; IE8 тогда работает как предыдущие версии IE.

Но как я буду делать это программно?


Видите ли, моя проблема не в моем приложении. Это нормально работает, если я вхожу в систему от одного пользователя, но когда я вхожу в несколько пользователей через разных пользователей из разных экземпляров браузера IE8, мои данные более поздней сессии переопределяют прежний, это потому, что оба браузера IE используют один и тот же идентификатор сессии. Это происходит из-за совместного использования сеанса IE8. Для одного приложения поддерживается только один сеанс, однако сколько пользователей я вхожу в систему. На самом деле я хочу вести сеанс для каждого пользователя.

Например, когда я вхожу в Gmail в одном браузере. Если я просто набираю Gmail в другом браузере. Он входит в систему автоматически. Я не хочу этого в моем заявлении. Я должен получить логин другого пользователя за раз, когда я должен выполнить независимую операцию.

Мое приложение использует сервер приложений Struts, Spring, Hibernate & JBoss.

Теперь скажите, как мне поступить?

Ответы [ 4 ]

2 голосов
/ 03 июня 2010

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

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

0 голосов
/ 17 июля 2010

Мне не понравились все остальные предоставленные решения. Единственное, что я хочу, это предоставить URL, по которому пользователь может щелкнуть, и он получит новый сеанс для входа в систему. Есть четкая функция sessionAuthentication, но не a openLinkInNewSessionWindow

Чтобы обойти браузер IE8, вы можете предоставить ссылку на страницу «множественный вход» и использовать некрасивый WScript из браузера. Пример:

<html>
  <head>    
    <script>
      function openNewSessionIE8NoMerge() {
        // This opens a new session window for windows with IE8, unfortually there is a Active X security warning.
        var WshShell = new ActiveXObject("WScript.Shell");
        WshShell.Run("iexplore.exe -nomerge www.gmail.com?testNewSession");
      }
    </script>
  </head>

  <a href="#" onclick="javascript:openNewSessionIE8NoMerge();">Click here for a new session IE8 (multiple sessions on the same application)</a>
</html>

Тест: Сохраните пример в sampleNewSession.html, откройте файл с IE8, в новой вкладке логин в gmail нажмите на ссылку в sampleNewSession. Теперь есть новое окно и не вошли в систему.

Это поможет пользователю, он может просто щелкнуть ссылку. Единственная проблема - сообщение безопасности ActiveX.

0 голосов
/ 03 июня 2010

Лучше всего, вероятно, использовать веб-инфраструктуру, которая поддерживает несколько одновременных сеансов (иногда называемых разговорами или потоками), или просто избегать слишком частого использования сеанса и переходить на REST. Если вам нужно взломать его на клиенте, вы не сможете сделать это из своего веб-приложения, но пользовательская программа win или файл .reg могут это сделать. Это также означает, что пользователи с другими ОС и браузерами будут сталкиваться с той же проблемой.

0 голосов
/ 03 июня 2010

Попробуйте сохранить идентификатор сеанса на стороне клиента. Например, на уровне JSP. Затем отправьте его обратно на серверный компонент и попробуйте отследить его. Скажите, если полученный сеанс в данный момент выполняется на стороне сервера, а затем удерживайте его некоторое время с помощью синхронизации или аналогичного механизма ожидания. Я надеюсь, что такого рода вопросы сессии должны быть решены хитро.

...