2015-04-14 4 views
0

J'ai une webapp assez simple qui suit le tutorials set out by Mkyong et d'autres.Comment distinguer les sessions http dans Spring MVC?

Je souhaite que la portée de ma webapp soit distinguée par la session du navigateur. C'est un utilisateur différent, ou un autre onglet du navigateur ne doit pas partager des objets avec les autres utilisateurs/onglets du navigateur.

Ici, nous faisons des changements minimes au code figurant dans le tutoriel:

package com.mkyong.common.controller; 

import javax.servlet.http.HttpServletRequest; 

import org.springframework.stereotype.Controller; 
import org.springframework.ui.ModelMap; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

@Controller 
@RequestMapping("/welcome") 
public class HelloController { 


    private int i = 0; 

    @RequestMapping(method = RequestMethod.GET) 
    public String printWelcome(ModelMap model, HttpServletRequest r) { 


     System.out.println(r.getSession().getId()); 

     System.out.println(i++); 


     model.addAttribute("message", "Spring 3 MVC Hello World"); 
     return "hello"; 

    } 

} 

Sortie:

F6E793D5ED12880E2F909A1A0C1D2D98 
0 
3E53022170EB77C0208AC0221A68D4D8 
1 
38A432F7C813A775E8F201AFB42178DB 
2 

Cela montre qu'il existe différentes sessions Http, mais ils ont le même ressources partagées.

Comment les distinguer?

+0

Qu'essayez-vous réellement d'accomplir? Les contrôleurs de ressort sont singleton par défaut, mais vous devez stocker l'état de l'utilisateur dans les sessions –

Répondre

0

Ajoutez simplement l'annotation portée à votre classe contrôleur:

@Controller 
@RequestMapping("/welcome") 
@Scope("session") 
public class HelloController { 
.... 
0

je suggère à la portée du modèle au lieu du contrôleur. Cela signifie créer une classe qui encapsulerait vos données de session et donnerait la portée de session de classe.

@Component 
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class MyModel { 
    // plain object 
    int i = 0; 
} 

L'avantage est que les données de session ne sont enregistrées dans la session HTTP et le contrôleur peut être singleton (ie. Sans portée spécifiée). Si votre configuration inclut la réplication de session http, cela peut être une approche plus judicieuse.