Best practice per l'utilizzo di sessioni HTTP (Java)

5

La mia domanda non riguarda come usare la sessione HTTP o come i valori vengono usati nella sessione. La domanda è più orientata all'approccio.

Nella mia attuale applicazione ci sono pochi valori memorizzati nella Session e richiediamo quei valori ogni ora e non, qui ci sono alcuni valori che recuperiamo dalla sessione

  1. Conservare
  2. Lingua
  3. Clienti
  4. pochi altri

Posso recuperare questi valori dalla sessione come

request.getSession().getAttribute( "name" )

Ho bisogno di quei valori non direttamente nel mio Controller, ma in un altro livello (ad esempio Facciata) quindi ho 2 opzioni

  1. Passa ogni valore richiesto al metodo facciata di request.getSession().getAttribute( "name" ) .
  2. Crea un metodo in ogni classe di facciata come.

Metodo in facciata

 private Object getSessionValue(final String key) {
    ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder
                            .currentRequestAttributes();
            return reqAttr.getRequest().getAttribute(key);
}

Sebbene entrambi funzionino nel mio caso, ma con una eccezione, ho bisogno di avere questo metodo su ogni Facade Class o di recuperare ogni oggetto in Controller.

C'è qualche altro modo o approccio che potrebbe essere più pulito o il mio approccio attuale va bene

    
posta Umesh Awasthi 29.11.2013 - 08:21
fonte

1 risposta

3

Il mio approccio personale sarebbe non utilizzare la sessione ovunque. Proverò a ridurre il suo utilizzo a livello di controller. Nel controller estraggo ciò di cui ho bisogno per la mia logica di business e più tardi non saprò mai che sia coinvolta una sessione web. Ciò renderà la logica portatile per le applicazioni non Web e funzionerà con tutti i suoi dati in un modo sicuro per il tipo che è privo di codice di tipo standard.

Se si desidera evitare il codice boilerplate per ottenere la richiesta, quindi la sessione e quindi gli elementi della sessione, l'approccio al metodo è sufficientemente preciso e una pratica comune nella mia esperienza. Se lo stai usando in Java, puoi migliorarlo un po 'aggiungendo alcuni generici:

 public static <T> T getSessionValue(final String key) {
    ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder
                        .currentRequestAttributes();
        return (T) reqAttr.getRequest().getAttribute(key);
}

Puoi usarlo ora in questo modo:

Integer someSessionInt = SessionUtils.<Integer>getSessionValue("someSessionIntKey");

Suppongo che il metodo sia definito in una classe SessionUtils statica. Se lo definisci in una classe di controller di base, vuoi usarlo dall'interno di un controller, dovresti chiamarlo in questo modo:

Integer someSessionInt = this.<Integer>getSessionValue("someSessionIntKey");

La parola chiave this può essere sostituita con super , ma senza di essa si verificherebbe un errore di compilazione dovuto ai generici.

Oltre al mio suggerimento sopra, c'è un altro modo per nascondere l'utilizzo della sessione e avere un'API / facciata libera da sessione e indipendente. Attaccando al paradigma programmazione-interfacce è possibile avere implementazioni di interfaccia che utilizzano la sessione, ma non viene mai mostrata dalle interfacce che si applicano alla facciata / api. Quindi, ad esempio, potresti avere un servizio di autorizzazione per scopi generali, un'interfaccia di trough esposta, che mostra chi è l'utente attualmente loggato, se è un ospite e se ha una specifica autorizzazione. La tua applicazione potrebbe quindi utilizzare un'implementazione concreta dell'interfaccia di servizio che ottiene l'utente dalla sessione. Quando si utilizza il servizio, l'interfaccia non espone nulla relativo alla sessione, quindi tutti gli usi rimangono indipendenti dalla sessione e digitano sicuri.

    
risposta data 29.11.2013 - 11:07
fonte

Leggi altre domande sui tag