Sessione HTTP: un singolo oggetto o multiplo?

3

Ho testato due approcci per memorizzare i dati della sessione:

  • Il classico: 1 chiave, 1 oggetto (e ogni chiave come static final String in una classe)

"user" --> UserObject

"preferences" --> List

...

  • Un approccio con solo 1 oggetto

"sessionObject" --> SessionObject

E il mio SessionObject contiene UserObject e l'elenco di preferenze come attributi. Questo è un esempio abbastanza semplice, ma immaginalo con 20+ attributi.

Il vantaggio che vedo nel secondo approccio è che:

  • Devi solo cancellare una chiave per assicurarti che la sessione sia vuota
  • Non devi creare il set fastidioso di final static String per creare le chiavi
  • Saprai quale tipo di oggetto recuperare (utilizzando la chiave devi cast )

Vedi qualche problema che potrei aver passato? O qualcosa va contro le migliori pratiche?

    
posta Michael Laffargue 25.02.2014 - 08:55
fonte

2 risposte

1

1 chiave, 1 oggetto sarà più prevedibile per quanto riguarda l'interazione con il server dell'app e le possibili tecniche di replica della sessione. Non sei sicuro di cosa intendi per "set di stringa statica finale" che è necessario. Puoi gestire le chiavi di sessione in qualsiasi modo.

Considera che hai 20 preferenze, e forse la tua classe di preferenze ha un enum di nomi di preferenze. Potrebbe ottenere / impostare una sessione un po 'indirettamente:

class Preferences {

    private static final SESSION_KEY_PREFIX = Preferences.class.getName()+'.';

    enum Name {
        LOCALE,
        ...
    }

    static String get(HttpSession session, Name name) {
        return (String)session.getAttribute(SESSION_KEY_PREFIX + name.name());
    }

    static void set(HttpSession session, Name name, String value) {
        session.setAttribute(SESSION_KEY_PREFIX + name.name(), value);
    }

    static void clear(HttpSession session) {
        for(Name name : Name.values()) {
            session.removeAttribute(SESSION_KEY_PREFIX + name.name());
        }
    }
}

Puoi aggiungere le preferenze semplicemente aggiungendo all'enumerazione e tutte le interazioni specifiche con la sessione sono incapsulate.

Questo esempio è piuttosto banale, quindi la classe Preferences stessa potrebbe anche diventare un enum, senza un enum separato di "Nome". Quale potrebbe essere:

enum Preference {
    LOCALE,
    ....;

    private final String sessionKey = Preference.class.getName()+'.'+name();

    String get(HttpSession session) {
        return (String)session.getAttribute(sessionKey);
    }

    void set(HttpSession session, String value) {
        session.setAttribute(sessionKey, value);
    }

    static void clear(HttpSession session) {
        for(Preference pref : Preference.values()) {
            session.removeAttribute(pref.sessionKey);
        }
    }
}
    
risposta data 20.03.2015 - 16:45
fonte
0

Per quelli che hanno la stessa domanda: In Application Server come Weblogic durante il clustering e la replica di sessione. La sessione viene copiata su altri server quando viene modificata. Per attivare questa copia, sembra che il server controlli i riferimenti degli oggetti nella sessione e una volta che rileva una modifica viene eseguita la replica. Pertanto, l'utilizzo di un solo oggetto contenente altri potrebbe impedire l'attivazione della copia.

Non testato.

    
risposta data 23.05.2014 - 16:15
fonte

Leggi altre domande sui tag