2010-10-22 5 views
1

J'ai le problème suivant, j'ai configuré la classe suivante qui devrait être stockée dans la session.Printemps MVC 3.0 accédant à la variable de session

<bean id="Users" class="com.doolloop.DlUser" scope="session"> 
<aop:scoped-proxy/> 
</bean> 

Alors je dans mon servlet Dispatcher je voudrais accéder à cet utilisateur de catégoriels et

@RequestMapping(value="/authenticate.do",method = RequestMethod.POST) 
      public String sampleAuthentication(@Valid Person person, BindingResult result, 
        Map model,HttpServletRequest request){ 
        ...... /some code 
    HttpSession session = request.getSession(); 
      DlUser user = (DlUser) session.getAttribute("Users"); 
        /// some uses for user object 

} 

Le problème est que je suis toujours obtenir null Valeur de l'objet utilisateur.

Qu'est-ce que je fais mal?

Deuxième problème, j'ai lu dans les articles que l'accès HttpSession n'est pas thread-safe, comment peut-il être fait de manière sûre? Devrait être genre de Singleton? Pourquoi ce n'est pas une opération Thread Safe?

Merci d'avance.

Danny.

Répondre

2

C'est un cas particulier lorsque vous voulez injecter un grain avec une plus courte portée dans un haricot avec une plus longue portée (par exemple un haricot scope session dans un haricot scope singleton)

Vous pouvez utiliser un lookup-method:

<bean id="yourSingletonBean" 
    class="your.singleton.BeanClass"> 
    <lookup-method name="getDLUser" bean="Users"/> 
</bean> 

Vous aurez besoin de faire de votre haricot singleton abstract, et créer une méthode abstractpublic DLUser getDLUser()

Cela, cependant, ne sont pas une solution parfaite. L'idée est de tenir le moins possible la session. Si vous n'avez pas besoin de stocker un bean dans la session, mais seulement l'utilisateur actuel, vous pouvez facilement appeler session.setAttribute(..) lorsque l'utilisateur se connecte, puis accéder à l'utilisateur actuel avec session.getAttribute(..), sans que l'utilisateur soit un bean du tout.

Une façon que j'ai choisi pour l'utilisateur actuel dans mon application est de créer une annotation personnalisée @SessionAttribute. Voir this question sur la façon d'y parvenir.

1

Les objets délimités "session" ne sont pas stockés en session, ils sont disponibles pour la session via le paradigme de l'injection directe régulière. C'est juste qu'ils sont liés à une session. Donc, si vous avez besoin de cela, vous devez injecter ce bean dans votre contrôleur. Lisez here pour plus d'informations.

+0

Cela signifie-t-il que ce bean existera la même période que la session Http existe? –

+0

oui, c'est exact, mais lisez la réponse de Bozho. Si vous injectez ce haricot dans un haricot de plus longue durée, l'effet ne sera pas le même que prévu. Il vaut mieux utiliser session.getAttribute() pour obtenir l'objet, ou utiliser AOP pour faire un proxy pour l'objet de session - regardez l'exemple ici pour plus de détails: http://wheelersoftware.com/articles/spring-session-scoped -beans.html. Essentiellement, ce lien explique comment créer un proxy pour le bean de la portée de la session, donc le proxy est celui qui obtient la bonne instance de l'objet correspondant à ce qui est en session –

Questions connexes