So che ha grandi probabilità di essere contrassegnato come duplicato, ma non sono riuscito a trovare esattamente quello che sto cercando
Questo è un problema comune e sono sicuro che abbia qualche soluzione di best practice ben definita
sfondo
Un'app SaaS a pagina singola, ha un sacco di trascinamento della selezione, l'utente può interagire con essa senza molta comunicazione del server per periodi di tempo
La sessione del server contiene solo l'oggetto utente, utilizzando un cookie di sessione non persistente
La sessione scade sul server dopo X ore
Alcune cose vengono caricate solo durante l'accesso
Problema
- L'utente lavora sull'app, al termine, l'utente non si disconnette, mantiene il browser aperto
- L'utente ritorna dopo più di X ore (la sessione non è valida sul server)
- L'utente interagisce con l'app senza bisogno di una connessione al server (trascina e rilascia cose, modifiche di testo ...)
- Solo alla successiva interazione del server (supponiamo che non ci sia salvataggio automatico) l'utente viene lanciato nella pagina di accesso e perde parte del suo lavoro
Possibili soluzioni
Ecco alcune soluzioni che ho in mente, vorrei sapere se ce ne sono altre e se c'è qualcosa di fondamentalmente sbagliato in ognuna di esse.
1. Non disconnettere mai l'utente
- Come? o mantenere una sessione lunga, mantenere un cookie persistente o ping "keep alive" javaScript
- Pro : l'utente non deve preoccuparsi di nulla, risolve il problema per loro
- Contro : non conforme a PCI, non sicuro e necessita di modifiche di sviluppo, ad es. Le cose caricate nella sessione solo al momento dell'accesso dell'utente devono spostarsi in un sotto-modello pub (ascoltare le modifiche agli eventi) o avere il timeout della cache.
2. Archiviazione locale
- Come? utilizzare la nuova memoria locale per memorizzare temporaneamente lo stato se si è disconnessi, reindirizzare alla pagina di accesso, persistere una volta effettuato l'accesso
- Pro : anche la base per il supporto "lavoro offline", non solo per gestire il timeout della sessione
- Contro : più difficile da implementare, è necessario eseguire l'unione dello stato dell'albero dei dati, non tutti i browser supportano
3. Salvataggio automatico
Ogni azione dell'utente che modifica il modello, dovrebbe persistere immediatamente (o tramite una sorta di coda lato client), ad esempio se spuntano una casella di controllo, cambiano un campo di testo o trascinano qualcosa, una volta che hanno fatto, persistono le modifiche.
- Come? Utilizzare un framework MV ** (Backbone.js / Knockout.js / Ember.js / Angular.js ecc.) Per associare il modello e persistere sulle modifiche.
- Pro : sembra una soluzione pulita, la sessione è attiva fintanto che l'utente è attivo, nessun lavoro sul lato client viene eseguito senza persistere.
- Contro : l'ultima azione eseguita dall'utente dopo la perdita di un timeout della sessione.
4. Disconnettersi dopo la scadenza della sessione
questo può avere diversi approcci
Chiedi al server "la sessione è scaduta" - questo è un po 'un problema 22 / Il gatto di Schrodinger, poiché la semplice domanda al server estende la sessione (riavvia il timeout),
- Come? O hai un server che supporta tale domanda (non ne conosco nessuno, ma vengo da Java Land) oppure, si può semplicemente tenere una tabella di ID sessione e l'ultimo tempo di accesso manualmente e chiedere al server passando la sessione ID come parametro invece del cookie, non sono sicuro che ciò sia possibile, ma sembra pericoloso, insicuro e di cattiva progettazione in qualunque pagina.login, persiste una volta effettuato l'accesso
- Pro : se c'era un tale supporto nativo nei server, sembra una domanda chiara e legittima (chiedere se l'utente X ha ancora una sessione o meno senza rinnovarla se lo fa)
- Contro : se il server non lo supporta (e di nuovo, non so se nessun server o framework abbia questa funzionalità), la soluzione alternativa presenta potenzialmente enormi rischi per la sicurezza.
Una soluzione alternativa che ho sentito è una breve sessione sul lato server e un ping sul lato client attivo, con un numero massimo di ping
- Come? Breve sessione sul server, il client esegue il ping di ogni sessione TimeOut / 2, ha un numero massimo di tentativi di Y.
- Pro : tipo di risolve il problema, veloce e sporco
- Contro : sembra un trucco, gestire da soli il rinnovo della sessione invece di lasciare che il server lo faccia
Timer lato client
Come? Avere un timer sul lato client e sincronizzarlo con quello del server riavviandolo su ogni richiesta in modo che sia uguale al timeout massimo della sessione del server meno un po 'di riempimento, dopo che l'utente non ha inviato alcuna richiesta al server, l'interfaccia utente mostra che "le sessioni sono sta per scadere, vuoi continuare? " (come hai fatto con l'online banking)
Pro : risolve il problema
- Contro : non riesco a pensare a nessuno, tranne la necessità di assicurarsi che la sincronizzazione funzioni
La domanda
Probabilmente mi manca qualcosa nell'analisi di cui sopra, potrebbe avere degli errori sciocchi e vorrei che il tuo aiuto li correggesse. Quali altre soluzioni posso avere per questo?
now
. 4.2 sembra un ottimo modo per uccidere il tuo server e aumentare i costi 4.3 Su Android, quando torni alla schermata principale sono abbastanza sicuro che il processo sia sospeso e che potrebbe anche interferire con il timer del tuo client.