Как запретить пользователю иметь несколько экземпляров одного и того же веб-приложения - PullRequest
13 голосов
/ 17 февраля 2009

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

Что происходит, однако, так это то, что кажется, что он испортил переменные Session, и тогда пользователь обновит свою предыдущую работу своей новой работой. Или они удалят свои предыдущие работы все вместе или кто знает ...

EDIT Я видел, как это делалось ранее с веб-приложениями для онлайн-банкинга. Если вы уже вошли в систему, новое окно сообщит вам, что приложение уже открыто. В моем случае пользователю не нужно входить в систему.

Есть ли простой способ определить, есть ли у них окно браузера, открытое для веб-приложения, и если это так, просто закройте браузер или откройте другую страницу, чтобы сообщить им, что за один раз можно открыть только 1?

Спасибо

Ответы [ 15 ]

0 голосов
/ 29 ноября 2016
 <script type="text/javascript">
        window.onload = function(){
        if (document.cookie.indexOf("_instance=true") === -1) {
        document.cookie = "_instance=true";
        // Set the onunload function
        window.onunload = function(){
            document.cookie ="_instance=true;expires=Thu, 01-Jan-1970 00:00:01 GMT";
        };
        // Load the application
        }
        else {
             alert(" Security Alerts.You Are Opening Multiple Window. This window will now close.");
             var win = window.open("about:blank", "_self"); win.close();
        // Notify the user
        }
        };
    </script>
0 голосов
/ 20 сентября 2016

У меня была такая же проблема, и я решил ее с помощью веб-сокетов (я использую pusher с php). Когда пользователь попадает на страницу, я устанавливаю переменную:

var firstTimeHere = true;

Затем я создал функцию веб-сокета в javascript, в которой идентификатор пользователя является частью имени функции, например:

var pingUser123 = function(){...}; 

Затем я использую ajax для запроса к серверу, на котором запущена сторона php веб-сокета:

$this->trigger("pingUser123");

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

var pingUser123 = function(){
    if(firstTimeHere){
       firstTimeHere = false;
    }else{
        app.stop();
        alert("Only one window at a time please.");
    }
};
0 голосов
/ 10 мая 2012

Если кто-то скопирует URL-адрес веб-сайта и вставит его в новое окно или вкладку, история браузера для этого окна / вкладки будет пустой ... так что вы можете использовать javascript и просматривать историю ..

if (history.length == 1) {  //0 for IE, 1 for Firefox
    // This is a new window or a new tab.
}

Теперь вы можете предложить пользователю закрыть вкладку или отключить эту страницу (например, сделав все элементы disabled).

0 голосов
/ 31 марта 2009

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

Однако вы можете сделать недействительным предыдущий сеанс, как только пользователь войдет в новый (немного похоже на поведение клиентов мгновенных сообщений).

При каждом входе в систему назначайте новый GUID пользователю в вашей базе данных. Также сохраните этот GUID в кеше сеанса (нет необходимости отправлять его туда и обратно на страницы, которые в любом случае не будут работать для запросов GET). При каждом запросе страницы сравнивайте GUID, назначенный пользователю в базе данных, с GUID в кэше сеанса. Если они не совпадают, верните ответ «Вы вошли откуда-то еще».

Обновление Я слишком быстро нажал на курок. Это не мешает сценарию, когда пользователь открывает несколько вкладок / окон в одном и том же процессе браузера. Таким образом, вам придется объединить это решение с предложением Дейва Андерсона для хранения хэша ViewState (или просто GUID), чтобы разрешить обратную запись только последней обслуживаемой странице в сеансе.

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

0 голосов
/ 17 февраля 2009

Вы можете проверить, есть ли у пользователя более одного активного сеанса. Это может сработать, но может быть проблематично, поскольку нет хорошего способа определить, действительно ли сеанс активен или нет.

...