Spring @ResponseBody无法使用session

时间:2016-08-11 21:11:08

标签: java spring angular

我有angular2应用程序并使用带有spring的Tomcat来获取数据。我不希望任何页面重新加载或重定向,我只需要数据,因此服务器的所有响应都有@ResponseBody注释。

我的问题是,由于这个注释,我无法获得用户会话变量。当我登录时,我创建了会话,将用户数据存储在其中,但是在下次调用时无法获取它。

@JsonIgnoreProperties(ignoreUnknown = true)
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public String login(HttpServletRequest REQ, @RequestBody String BODY) throws Exception
{
            ...check if all ok...
                REQ.getSession().setAttribute("user", user);
            ... return user data...
}

有没有其他方法可以将我的数据连同所需数据一起发送回客户端,以便能够使用会话。

编辑: 问题不在服务器端而是客户端。 Angular默认情况下不会在跨域请求中发送cookie JSESSIONID。

2 个答案:

答案 0 :(得分:1)

您在会话上下文中放置的任何内容都不可供客户端使用,它仅供服务器使用。有关servlet如何工作的详细解释,请参阅this stack overflow post,特别是有关会话状态如何工作的部分。

正如您所看到的,它通过向包含session-Id的响应添加会话cookie来工作。服务器将该id下的会话状态存储在内存中,当未来的请求带有该session-id时,它会使会话状态再次可用于将来的请求。

如果您的下一个请求无权访问会话状态,则很可能会话cookie未正确传播。我建议你先检查一下。它应该在您登录的响应中,并且应该在对服务器的进一步请求中发布。

答案 1 :(得分:1)

首先检查您的请求/响应(例如在Chrome开发工具中)。 Tomcat创建名为JSESSIONID的新cookie以将客户端与服务器会话对象绑定,因此请在登录方法响应头中查找此cookie。然后确保在下一个请求中将此cookie发送回您的服务器。会话创建与Spring@ResponseBody无关,其生命周期由容器(Tomcat)管理。

此外,如果您要提出跨域请求,请检查this answer