2010-07-16 14 views
5

Devo inizializzare ogni nuova sessione http con alcuni valori. Come lo faccio?Come fare qualcosa all'avvio della sessione in Spring MVC?

Ho tentato di creare un componente con ambito sessione e di inizializzare la sessione in @PostConstruct, ma i bean con ambito sessione non vengono creati in modo imperioso finché non chiedo di accedervi.

+0

Se quei valori inizializzati devono essere usati da qualcos'altro, sicuramente è abbastanza buono averli inizializzati la prima volta che vengono referenziati? – skaffman

+0

Ho un bean che contiene alcuni valori relativi alla sessione dell'utente. Non voglio mettere la logica di inizializzazione in quella perché è una responsabilità separata. Nemmeno voglio mettere l'invocazione del metodo di inizializzazione nei servizi che fanno riferimento a quel bean di sessione. Non riesco a vedere un modo corretto di inizializzazione sul riferimento – artemb

+0

Puoi spiegarlo in un codice di esempio specifico, mostrando come desideri che funzioni? Ho il sospetto che sia piuttosto semplice di quanto pensi. – skaffman

risposta

3

Se si è assolutamente certi che il vostro voglia di inizializzazione ansioso, è possibile effettuare le seguenti operazioni:

  • definiscono un intercettore per tutti i fagioli
  • Defina un <lookup-method> per questo intercettore:

    <lookup-method name="getCurrentSessionBean" 
        bean="yourSessionBeanToInitialize"/> 
    
  • definire l'intercettore abstract, con un metodo abstractgetCurrentSessionBean()

  • creare una bandiera initialized sul fagiolo
  • su ogni intercettazione, chiamare il metodo di ricerca e tornerà un'istanza del bean dalla sessione corrente. Se non è inizializzata (la bandiera), inizializzare
  • è anche possibile utilizzare @PostConstruct e risparmiare il initizlied bandiera

Un'altra opzione è quella di:

  • definire una HttpSessionListener in web.xml (o con le annotazioni se si utilizza servlet 3.0)
  • uso WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext) per ottenere contesto
  • chiamata getBean(..) per ottenere un'istanza del bean di sessione con ambito
  • verrà inizializzato con @PostConstruct a quel punto

La prima opzione è "più a molla", il secondo è più facile e veloce da implementare.

+0

Nel metodo 2 dove ottengo servletContext? – artemb

+0

Ottenuto: HttpSessionEvent.getSession(). GetServletContext() – artemb

+0

Uso un bean con scope sessione con proxy pro-conops UserInfo per contenere le informazioni sulla sessione utente. Il problema è che l'istanza di UserInfo I nel listener della sessione è diversa da quella che ottengo nel mio controller. Immagino che questo possa essere un problema in contesti diversi ma non ne sono sicuro – artemb

Problemi correlati