2016-12-14 4 views
0

Problèmes liés à l'utilisation de AutoWired HttpSession:Spring MVC lorsque autotired HttpSession sera créé?

LoginController appelle LoginService en lui passant HttpServletRequest en tant que paramètre.

J'ai autowired HttpSession comme ça dans quelques autres classes annotées (mais pas LoginService):

@Autowired 
private HttpSession httpSession; 

En classe LoginService, si je tente d'obtenir la session en appelant request.getSession(false) Je reçois nulle dans certains cas.

Si j'essaie d'obtenir une session en appelant le request.getSession(true), je me retrouve avec deux objets HttpSession (un ici et un autre par AutoWiring).

Si j'autopère HttpSession dans la classe LoginServic et que j'utilise la session à partir de là, je termine également avec deux objets HttpSession.

Quand exactement autowired HttpSession sera créé? Quelle est la meilleure façon de gérer cette situation?

Merci!

+0

Bienvenue dans Stack Overflow! Veuillez consulter notre [Liste de questions sur les questions de sécurité] (http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist) pour vous aider à poser une bonne question et obtenir ainsi une bonne réponse. –

+0

On ne sait pas très bien ce que vous demandez, mais la meilleure approche consiste à utiliser Spring Security et à ne pas écrire vous-même le code de sécurité. – chrylis

+0

Étant donné le moment actuel de notre projet, je ne peux pas utiliser Spring Security. Si vous suivez les étapes mentionnées, vous comprendrez mon problème. Si vous n'êtes pas clair dans une étape faites le moi savoir, je peux corriger. En bref, j'ai besoin de savoir quand exactement AutoWired HttpSession sera créé et comment l'utiliser. – Swamy

Répondre

1

Le LoginController est censé gérer Web Concern.
Le LoginService est censé gérer le problème d'authentification et ne pas être censé être au courant de la préoccupation Web.
Une session Http est une préoccupation du domaine Web. Et donc, doit être géré dans la classe qui gère le Web Concern -> le LoginController. Donc, le LoginController déclarera en tant que paramètre d'une méthode Mappée la HttpSession, et lira/écrit ce dont il a besoin de la HttpSession et le passera en tant que paramètre de la méthode appelée sur le LoginService.
Quelque chose comme:

@Controller 
public class ApplicationController { 

@Autowired 
private LoginService loginService; 

@RequestMapping(value = "/login", method = POST) 
public void Login(HttpSession httpSession) { 
    final String myAttribute = String.valueOf(httpSession.getAttribute("myAttribute")); 
    loginService.doWhatYouNeedToDo(myAttribute); 
} 
} 
+0

Le problème que je rencontre est le suivant: La httpSession transmise à la méthode Login est différente de la méthode autowired httpSession et se terminant deux objets httpSession différents. – Swamy

+0

@Swamy avez-vous résolu votre problème? Je cours dans le même problème! ma httpsession est différente dans mon processus de connexion que dans mon appel de repos –