2017-05-31 12 views
1

J'ai simple SpringBoot RestController:@Autowired HttpSession pas simple économie String - SpringBoot

@RestController 
public class PasswordController implements ErrorController { 

    private static final String ERROR_PATH = "/error"; 
    public static final String IS_USER_LOGGED_IN = "isUserLoggedIn"; 
    public static final String BAD_REQUEST_MESSAGE = "Bad Request ¯\\_(ツ)_/¯"; 

    @Autowired 
    private PasswordService passwordService; 

    @Autowired 
    private HttpSession httpSession; 

    @RequestMapping(value = "/user/create/{name}/{password}", method = RequestMethod.GET) 
    public String createNewUserAndPassword(@PathVariable final String name, @PathVariable final String password) { 
     try { 
      return passwordService.createNewUserAndPassword(name, password); 
     } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) { 
      return ERROR_PATH; 
     } 
    } 

    @RequestMapping(value = "user/login/{name}/{password}", method = RequestMethod.GET) 
    public String loginUser(@PathVariable final String name, @PathVariable final String password) throws UnsupportedEncodingException, NoSuchAlgorithmException { 
//  return passwordService.loginUser(name, password); 
     final String result = passwordService.loginUser(name, password); 
     if (result.contains(PasswordService.WELCOME_MESSAGE)) { 
      this.httpSession.setAttribute("name", name); 
     } 
     return result; 
    } 

    @Override 
    public String getErrorPath() { 
     return ERROR_PATH; 
    } 

    @RequestMapping("/error") 
    public String error() { 
     return BAD_REQUEST_MESSAGE; 
    } 

    @RequestMapping(value = "getEnemies", method = RequestMethod.GET) 
    public String getEnemies() { 
     if (this.httpSession.getAttribute("name") != null) { 
      return "enemies List...."; 
     } else { 
      return "(ง'̀-'́)ง"; 
     } 
    } 
} 

Il est tout à fait simple que vous pouvez voir, mais la chaîne je sauve ici:

this.httpSession.setAttribute("name", name) 

peut-jamais être récupéré ici aussi longtemps qu'il est toujours nulle:

this.httpSession.getAttribute("name") != null 

J'ai débogué le code, et vous pouvez récupérer la chaîne immédiatement après le set. Cependant, quand il atteint l'autre méthode, il ne fonctionnera pas à HttpSession changements d'objet. (Il a même un autre ID)

Quel peut être le problème? Merci

+0

Ne pas '@ Autowire' le' HttpSession' juste l'ajouter comme un argument de méthode à la place. –

Répondre

0

En supposant d'autres gestionnaires (getEnemies()) lorsque vous vouliez dire autre méthode

Oui l'objet change puisque les deux sont différents autres appels qui fonctionnent sur différents threads. Je ne suis pas sûr de ce que pourrait être la racine de l'objet HttpSession que vous avez injecté, mais ce que vous y stockez peut ne pas être persistant (probablement local pour ce Thread). C'est ce qui vous oblige à obtenir une valeur nulle dans l'autre méthode.

+0

Oui, mais, comment puis-je l'empêcher? Je voudrais récupérer cette chaîne –

+0

https://stackoverflow.com/questions/41151804/spring-mvc-when-autowired-httpsession-will-be-created cela pourrait vous aider. Je suis juste un débutant tellement désolé si je ne pouvais pas vous obtenir la solution – Rakesh

+0

et vous en avez fait un restcontroller mais encore vous envoyez une chaîne (en l'assumant comme vue) .Quelle est votre intention? – Rakesh