2012-01-08 15 views
5

Ho un'applicazione GWT con servizio RPC nel back-end. Attualmente sto cercando di implementare il supporto degli utenti e l'unica domanda che rimane è il modo in cui dovrei memorizzare i dati di sessione.Utilizzo delle sessioni nell'applicazione GWT

che sto memorizzare id sessione utilizzando

getThreadLocalRequest().getSession().setAttribute("sid", "randomSIDgoeshere"); 

Quindi, la prima domanda è di più per servlet Java che a GWT. Fa questa garanzia codice che la prossima volta che effettuare una chiamata in questo modo:

getThreadLocalRequest().getSession().getAttribute("sid"); 

Sarebbe essere sia nullo (nel caso in cui viene chiamato per l'utente che non ha ancora visitato la porzione di codice in cui è impostato l'attributo SID) o sarebbe esattamente lo stesso SID che ho già salvato per quell'utente. In altre parole, questi 2 pezzi di codice sono specifici per utente? (per utente Intendo un singolo browser su un singolo computer)

La seconda domanda riguarda l'archiviazione dei mapping tra SID e alcuni dati aggiuntivi come l'id utente. In caso ho un codice come questo:

public class MyGwtServiceImpl extends RemoteServiceServlet implements MyGwtService { 
    // SID to User ID mappings 
    private final Map<String, String> sessions = 
    new HashMap<String, String>(); 
    ... 
} 

E 'garantito che sessions è sempre lo stesso oggetto per tutte le richieste ed i suoi dati rimarranno "vivo" a meno che l'intera applicazione è terminato? (Tomcat viene fermato per esempio) È un approccio normale o dovrei mantenere tutti questi mapping sul mio DB?

risposta

7

Primo:

Sì, lo garantisce. La prossima volta che chiami getThreadLocalRequest().getSession().getAttribute("sid"); alla prossima richiesta, l'attributo sid rimarrà lì. Ma ricorda, questa è l'area richiesta locale, quindi solo le richieste dello stesso utente (browser + ip) devono condividere le informazioni. Ciò significa:

Fatto:

  • utente A si collega con Firefox
  • si memorizza un valore casuale X con l'ID Y

Caso 1

  • all'utente un collega con Firefox
  • È possibile recuperare la X

Caso 2

  • utente A si collega con Google Chrome
  • Non è possibile recuperare il valore X

Caso 3

  • utente B si collega con Firefox
  • Non è possibile retrarre Ieve il valore X

Quindi sì, il contenuto della sessione è specifico dell'utente. Ciò che esiste in una sessione non implica che esisterà in un'altra sessione.

Secondo:

No, non è garantito. Sebbene la maggior parte delle volte venga chiamata la stessa entità servlet, non è garantito che esisterà sempre. Se si desidera persistere con gli attributi nel proprio servelet, è necessario dichiarare tali attributi come statici e, pertanto, THAT attributo statico non sarà specifico dell'utente. O è possibile memorizzare nel ServeletContext

Dico questo perché diverse implementazioni (come Glassfish) possono terminare le istanze se la servelet non viene richiesta per un lungo periodo di tempo (per quanto mi ricordo, non sono sicuro di questo (Glassfish termina l'istanza)). Ma non c'è documentazione che affermi che garantisce che sarà la stessa istanza, quindi non è possibile dichiarare attributi non statici e condividere tra istanze diverse.

+0

Grazie, gran bella risposta! – agibalov

Problemi correlati