我有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。
答案 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。