Springboot中的HttpSession

时间:2018-08-20 12:38:15

标签: java spring-mvc spring-boot httpsession

我有两个控制器。我试图以一种方法将登录的用户放入会话,然后以另一种方法获取它。但是会话不同,如何解决?

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/user/signIn", method = RequestMethod.POST)
    public ResponseEntity<DataUser> signIn(@RequestBody @Valid SignInUser signInUser,
                                           HttpSession session) {
        User user = userService.getUser(signInUser.getEmail(), signInUser.getPassword());
        session.setAttribute("user", user);
        DataUser dataUser = new DataUser((User) session.getAttribute("user"));
        return ResponseEntity.ok(dataUser);
    }

}

@RestController
public class MessageController {

    @Autowired
    private MessageService messageService;

    @RequestMapping(value = "/data/message", method = RequestMethod.POST)
    public Message save(@RequestBody NewMessage newMessage,
                        HttpSession session) {
        System.out.println(session.getAttribute("user"));
        Message message = new Message(newMessage);
        LocalDateTime dateTime = LocalDateTime.now();
        message.setDateTime(dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        message.setNumberRating(0);
        return messageService.save(message);
    }

}

session.getAttribute(“ user”)为空

1 个答案:

答案 0 :(得分:2)

WebApp会话的常见行为是通常通过称为JSESSIONID的cookie来识别您的客户端,但是对于REST调用而言,您甚至没有机会从浏览器,因此您不能说一个请求与另一个请求来自同一“机器/用户”。

为此,您需要:

  • 正确配置并启用Spring会话
  • 有一种方法可以识别您的请求和某种独特的ID。

每个新请求都必须通知您相同的标识符,因此您可以请求spring之类的“给我该用户的会话”。

这是Spring Session的更详细的教程。