Wiem, że ma to duże szanse na oznaczenie jako duplikat, ale nie mogłem znaleźć dokładnie tego, czego szukam
Jest to powszechny problem i jestem pewien, że ma dobrze zdefiniowane najlepsze rozwiązanie
tło
Jednostronicowa aplikacja SaaS ma wiele funkcji „przeciągnij i upuść”, użytkownik może z nią korzystać przez długi czas bez komunikacji z serwerem
Sesja serwera przechowuje tylko obiekt użytkownika, używając nietrwałego pliku cookie sesji
Sesja wygasa na serwerze po X godzinach
Niektóre rzeczy są ładowane tylko podczas logowania
Problem
- Użytkownik działa w aplikacji, gdy skończysz, użytkownik się nie wylogowuje, po prostu utrzymuje przeglądarkę otwartą
- Użytkownik wraca po ponad X godzinach (sesja jest unieważniona na serwerze)
- Użytkownik wchodzi w interakcję z aplikacją bez potrzeby połączenia z serwerem (przeciąganie i upuszczanie elementów, edycja tekstu ...)
- Tylko przy następnej interakcji z serwerem (załóżmy, że nie ma automatycznego zapisywania) użytkownik zostaje przeniesiony na stronę logowania i traci część swojej pracy
Możliwe rozwiązania
Oto kilka rozwiązań, które mam na myśli, chciałbym usłyszeć, czy są jakieś inne, a jeśli coś jest zasadniczo nie tak z którymkolwiek z nich.
1. Nigdy nie wylogowuj użytkownika
- W jaki sposób? albo utrzymuj długą sesję, zachowaj trwałe ciasteczko, albo javaScript „keep alive” ping
- Plusy : użytkownik nie musi się o nic martwić, naprawia dla nich problem
- Wady : niezgodny z PCI, niezabezpieczony i wymaga zmian programistycznych, np. Rzeczy załadowane do sesji tylko przy logowaniu użytkownika muszą przejść do podmodelu pub (słuchanie zmian zdarzeń) lub mieć limit czasu pamięci podręcznej.
2. Lokalne przechowywanie
- W jaki sposób? użyj nowej pamięci lokalnej, aby tymczasowo zapisać stan po wylogowaniu, przekieruj na stronę logowania, zachowaj po zalogowaniu
- Plusy : podstawa do obsługi „pracy offline”, a nie tylko obsługi limitu czasu sesji
- Minusy : trudniejsze do wdrożenia, należy wykonać scalanie stanu drzewa danych, nie wszystkie przeglądarki obsługują
3. Automatyczne zapisywanie
Każda czynność użytkownika, która zmienia model, powinna być natychmiastowa (lub za pośrednictwem jakiejś kolejki po stronie klienta), np. Jeśli zaznaczą pole wyboru, zmienią pole tekstowe lub przeciągną i upuszczą coś, gdy zostaną wykonane, zachowają zmiany.
- W jaki sposób? Użyj frameworka MV ** (Backbone.js / Knockout.js / Ember.js / Angular.js itp.), Aby powiązać model i zachować zmiany.
- Zalety : Wydaje się, że jest to czyste rozwiązanie, sesja jest aktywna tak długo, jak długo użytkownik jest aktywny, żadna praca po stronie klienta nie jest wykonywana bez jej utrwalenia.
- Minusy : ostatnia czynność wykonywana przez użytkownika po utracie limitu czasu sesji.
4. Wyloguj użytkownika po zakończeniu sesji
może to mieć kilka podejść
Zapytaj serwer „wygasła sesja” - to trochę haczyk 22 / kot Schrodingera, ponieważ samo pytanie do serwera przedłuża sesję (restartuje limit czasu),
- W jaki sposób? Albo masz serwer, który obsługuje takie pytanie (nie znam żadnego, ale pochodzę z Jawy) lub możesz po prostu przechowywać tabelę identyfikatorów sesji i czas ostatniego dostępu ręcznie i zapytać serwer, przekazując sesję Identyfikator jako parametr zamiast pliku cookie, nie jestem pewien, czy jest to w ogóle możliwe, ale brzmi to niebezpiecznie, niepewnie i źle. Strona logowania, trwa po zalogowaniu
- Plusy : Jeśli na serwerach istniała taka natywna obsługa, brzmi to jak czyste, uzasadnione pytanie (pytanie, czy użytkownik X nadal ma sesję, czy nie bez odnawiania jej, jeśli tak jest)
- Wady : jeśli serwer go nie obsługuje (i ponownie, nie wiem, czy jakikolwiek serwer lub struktura ma taką funkcjonalność), wówczas obejście może potencjalnie wiązać się z dużym ryzykiem bezpieczeństwa.
Jednym z obejść, które słyszałem, jest krótka sesja po stronie serwera i pingowanie po stronie klienta, które ma maksymalną liczbę pingów
- W jaki sposób? Krótka sesja na serwerze, klient wysyła ping do każdej sesjiTimeOut / 2, ma maksymalną liczbę powtórzeń Y.
- Plusy : rodzaj naprawia problem, szybki i brudny
- Minusy : Czuje się jak włamanie, samodzielne zarządzanie odnawianiem sesji zamiast pozwalania temu serwerowi
Zegar po stronie klienta
W jaki sposób? Posiadaj licznik czasu po stronie klienta i zsynchronizuj go z serwerem, uruchamiając go ponownie przy każdym żądaniu, aby był równy maksymalnemu limitowi czasu sesji serwera pomniejszonemu o dopełnianie, po tym, jak użytkownik nie wyśle żadnego żądania do serwera, interfejs użytkownika pokazuje „sesje to zbliża się przerwa, czy chcesz kontynuować? ” (jak w bankowości internetowej)
Plusy : rozwiązuje problem
- Minusy : nie mogę wymyślić żadnego z wyjątkiem potrzeby upewnienia się, że synchronizacja działa
Pytanie
Prawdopodobnie brakuje mi czegoś w powyższej analizie, mogę mieć jakieś głupie błędy i chciałbym, abyś pomógł je poprawić. Jakie inne rozwiązania mogę na to mieć?
now
. 4.2 brzmi jak świetny sposób na zabicie serwera i zwiększenie kosztów. 4.3 W Androidzie, gdy wracam do ekranu głównego, jestem prawie pewien, że proces został wstrzymany, co może również zakłócać działanie timera po stronie klienta.