要求:我们的应用程序需要支持同一用户打开我们的Web应用程序作为单独的会话。
问题不在于如何在角度2中使用cookie,但是当角度2应用程序对服务器进行休息调用时,如何从HTTPServletRequest对象中获取cookie。
实施:服务器端restful应用程序有一个过滤器,用于在cookie中设置用户的浏览器会话,然后在HttpServletResponse中设置。 Angular客户端在应用程序引导程序上进行一次调用,该引导程序通过服务器过滤器在cookie中设置用户的浏览器会话。
问题陈述:角度客户端正在进行第一次休息呼叫,该呼叫通过服务器过滤器来设置浏览器会话cookie。当我打开chrome开发人员工具时,我确实看到其他api响应有“set-cookie”,它有服务器设置的cookie,但是当我在开发人员工具中打开应用程序标签时,我看不到任何cookie集。 之后,如果我通过角度应用程序进行任何其他休息调用,它不会在请求或请求标头中发送cookie。现在,我们的应用程序rest api依赖于此cookie值存在于HttpServletRequest中,现在它失败了。
有人可以指导我吗?我必须在角度2应用方面做错了,我无法捕捉到。 我试过传递“withCredentials = true”,但没有变化。
我注意到的另一件事是,如果我发出“GET”请求,那么我确实在请求标题中看到了cookie,但对于“POST”请求,我没有看到cookie的任何内容。
请建议。
设置Cookie的服务器端代码
String uniqueId = RandomStringUtils.randomAlphanumeric(32);
Cookie userSessionCookie = new Cookie("userSessionId", uniqueId);
if (getDefaultDomain() != null) {
userSessionCookie.setDomain(getDefaultDomain());
}
httpServletResponse.addCookie(userSessionCookie); httpServletResponse.addHeader("Access-Control-Allow-Credentials", "true"); httpServletResponse.addHeader("access-control-allow-methods", "GET, POST, PUT, PATCH, DELETE, OPTIONS");
httpServletResponse.addHeader("Access-Control-Allow-Headers", "Content-Type, token,withCredentials");
有线2请求服务器从HttpServletRequest获取cookie
renderFF() {
//prepare renderFInput object
var fcRenderInput = {};
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers, withCredentials: true
});
this._http.post('/api/v1/render/feature/fc',fcRenderInput,options)
.subscribe((res) => {
console.log(res.json());
});
}
答案 0 :(得分:0)
只是建议如果这只是一个浏览器和多个标签,在这种情况下,您可以在其中设置一些标志时使用本地存储。此外,当您尝试在新选项卡中打开相同的应用程序时。检查标志是否存在,用户是否尝试在同一浏览器的其他选项卡中打开相同的Web应用程序。您还需要删除在某个点之后设置的本地存储。 我希望你能得到一些解决这个问题的技巧:)