Walidacja czy użytkownik ma otwarte więcej niż jedną kartę przeglądarki

0

Cześć Mam napisaną aplikację w ASP.NET MVC czy można jakoś walidować to czy użytkownik ma otwartą więcej niż jedną kartę w przeglądarce ? :)

0

Chyba bardziej poprawne jest napisać tak, aby apka była odporna.
W Javie EE mowa o zakresach Sesji, Nawigacji itd - i jeden z nich (chyba Navigation???) prawidłowo wchodzi w sytuację "rozmnożenia zakładek".

Mignęło mi przed oczami, że ASP ma podobny koncept

EDIT: nie uprawiam ASP, więc to taka wiedza "widziałem przez ramię"

2

brzmi to jak jakiś WTF, a zatem:

ale po co?

2

A co jak sobie otworzy jedną tabkę w Chrome a drugą w FireFox'ie? Walidować się oczywiście da w obrębie jednej przeglądarki gdzie ciastka i local storage są dzielone dla tej samej domeny, no pomiędzy przeglądarkami już takiej możliwości nie ma.

1

Pisałem kiedyś takie rozwiązanie oparte o WebSocket, zezwalałem na połączenie tylko 1 okna przeglądarki z danego adresu IP, jeśli było już jedno podłączone i dołączyło nowe stare zostawało rozłączone a karta zamykana lub rozłączana od danych.

Działa to niezależnie od sieci i komputera czy przeglądarki

Także chyba tutaj jest dobry punkt na rozwiązanie :)

1

No takie rzeczy to się załatwia przez ActiveX albo Applet Javy.

Albo porzucając pracę w PHP Intercity i implementując operacje bez trzymania stanu pojedynczej strony w sesji na serwerze.

1

Nie wiem po co ci to ale nie oceniam bo sam widziałem kiedyś coś takiego - serwer nie uciągał bo użytkownicy odpalali po 20 instancji aplikacji i puszczali równolegle kilkanaście / kilkadziesiąt skomplikowanych zapytań do bazy. Rozwiązaniem na jakie wpadł management to ograniczenie użytkownikom ilości instancji do 5... Co gorsze rozwiązanie miało być zaimplementowane bez zmiany czegokolwiek w bazie danych. Koniec końców zostało oparte na liczeniu eventów w audit table na której nawet nie ma indeksów. To się w sumie nadaje do tematu "programistyczne wtf".

Ekhm, tak czy inaczej - przykładowo

  1. Możesz się komunikować przez localStorage. Jeśli się zasubskrybujesz do eventu "storage" to localStorage może służyć za broadcast. Możesz wtedy w dowolnej chwili poprosić wszystkie zakładki żeby się odezwały i je policzyć. Minus - działa tylko w obrębie jednej przeglądarki. W dodatku chrome ostatnio zaczął usypiać nieużywane od kilkunastu minut zakładki - te prawdopodobnie nie będą miały szansy się odezwać
  2. Możesz użyć sessionStorage żeby ograniczyć sesję użytkownika tylko do jednej zakładki, wtedy będzie musiał się zalogować jeszcze raz w każdej innej (też w innej przeglądarce) i od strony serwera będziesz widział że użytkownik się loguje drugi raz. Musiałby być też jakiś mechanizm heartbeat. Minus - po zamknięciu jednej zakładki user bez wylogowania prawdopodobnie nie będzie mógł otworzyć szybko aplikacji jeszcze raz bo "system" będzie myślał że nadal używa poprzedniej
  3. Możesz generować UUID w każdej nowej zakładce, zwłaszcza proste jeśli to SPA i wysyłać ten ID z żądaniami - po stronie serwera możesz przyjmować tylko żądania od ostatniego IDka dla tego usera a resztę ignorować. Minus - będzie działała tylko ostatnio otworzona karta, wszystkie inne po cichu przestaną działać, niezbyt intyicyjne i ciężko przerwać istniejące zapytania
xraxon napisał(a):

zezwalałem na połączenie tylko 1 okna przeglądarki z danego adresu IP

Tylko ograniczasz w ten sposób całą sieć. Dużo sieci osiedlowych używa jednego zewnętrznego IP dla nawet setek komputerów, a "X-Forwarded-For" można manipulować. To może być dobre rozwiązanie dla wewnętrznej aplikacji.

0

@WeiXiao: Czemu WPF to jest strona internetowa

1 użytkowników online, w tym zalogowanych: 0, gości: 1