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 ? :)
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ę"
brzmi to jak jakiś WTF, a zatem:
ale po co?
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.
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 :)
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.
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
- 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ć
- 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
- 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.
@WeiXiao: Czemu WPF to jest strona internetowa