如何修复从 angular 7 到 Jersey 服务的 http 调用中丢失 session
How to fix loss of session in http calls from angular 7 to Jersey service
我使用 Tomcat 从 angular 7 客户端对 Jersey REST 服务进行 HTTP 调用。问题是登录后 session 丢失了。
我尝试使用不同的 headers,但没有找到解决方案。
我不使用代理。
我使用了一个 CORS 过滤器和一个 login+session 过滤器,它告诉我成功登录后 session 丢失了。 session 过滤器仅在登录后的后续 HTTP 调用中使用。我使用 POSTMAN 测试了该服务,在这种情况下 session 没有丢失。
Angular 调用 HTTP 登录服务:
public login(user: User): Observable<number> {
const url = 'http://localhost:8080/CouponsWebApp/user/login';
return this.httpService.post<number>(url, user, {withCredentials: true})
.pipe(catchError(this.messageService.handleError<number>('login'))
);
}
服务器中的 CORSFilter:
res.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");
res.setHeader("Access-Control-Allow-Credentials", "true");
res.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "x-requested-with,Content-Type");
在服务器中登录并session 过滤器:
HttpSession session = ((HttpServletRequest) request).getSession(false);
System.out.println("session=" + session);
if (session == null) { // session expired
try {
((HttpServletResponse) response).sendRedirect(((HttpServletRequest) request).getContextPath() + "/user/login");
return;
} catch (IOException e) {
System.out.println(e.getMessage());
}
} else {
CouponClientFacade couponClientFacade = (CouponClientFacade) session.getAttribute("CouponClientFacade");
System.out.println("couponClientFacade=" + couponClientFacade);
if (couponClientFacade == null) { // not logged in
try {
((HttpServletResponse) response).sendRedirect(((HttpServletRequest) request).getContextPath() + "/user/login");
return;
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
我希望在 session 过滤器中得到 session,但它打印 session=null.
您应该将 {withCredentials: true}
添加到所有请求中,而不仅仅是登录。它强制 http 请求用它发送 cookie,因此,可以检索会话
对我有用的解决方案是在 Chrome 中添加一些参数,仅对开发环境有用:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="c:\temp-chrome"
我使用 Tomcat 从 angular 7 客户端对 Jersey REST 服务进行 HTTP 调用。问题是登录后 session 丢失了。
我尝试使用不同的 headers,但没有找到解决方案。 我不使用代理。 我使用了一个 CORS 过滤器和一个 login+session 过滤器,它告诉我成功登录后 session 丢失了。 session 过滤器仅在登录后的后续 HTTP 调用中使用。我使用 POSTMAN 测试了该服务,在这种情况下 session 没有丢失。
Angular 调用 HTTP 登录服务:
public login(user: User): Observable<number> {
const url = 'http://localhost:8080/CouponsWebApp/user/login';
return this.httpService.post<number>(url, user, {withCredentials: true})
.pipe(catchError(this.messageService.handleError<number>('login'))
);
}
服务器中的 CORSFilter:
res.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");
res.setHeader("Access-Control-Allow-Credentials", "true");
res.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "x-requested-with,Content-Type");
在服务器中登录并session 过滤器:
HttpSession session = ((HttpServletRequest) request).getSession(false);
System.out.println("session=" + session);
if (session == null) { // session expired
try {
((HttpServletResponse) response).sendRedirect(((HttpServletRequest) request).getContextPath() + "/user/login");
return;
} catch (IOException e) {
System.out.println(e.getMessage());
}
} else {
CouponClientFacade couponClientFacade = (CouponClientFacade) session.getAttribute("CouponClientFacade");
System.out.println("couponClientFacade=" + couponClientFacade);
if (couponClientFacade == null) { // not logged in
try {
((HttpServletResponse) response).sendRedirect(((HttpServletRequest) request).getContextPath() + "/user/login");
return;
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
我希望在 session 过滤器中得到 session,但它打印 session=null.
您应该将 {withCredentials: true}
添加到所有请求中,而不仅仅是登录。它强制 http 请求用它发送 cookie,因此,可以检索会话
对我有用的解决方案是在 Chrome 中添加一些参数,仅对开发环境有用:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="c:\temp-chrome"