如何解决从Angular 7到Jersey服务的http通话中会话丢失的问题

时间:2019-04-13 19:30:00

标签: angular session jersey

我使用Tomcat从angular 7客户端到Jersey REST服务进行HTTP调用。问题是登录后会话丢失。

我尝试使用不同的标题,但没有解决方案。 我不使用代理。 我使用了CORS过滤器和login + session过滤器,该过滤器向我显示成功登录后会话丢失。会话过滤器仅在后续HTTP调用后使用。我使用POSTMAN测试了服务,在这种情况下会话不会丢失。

对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");

服务器中的登录和会话过滤器:

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 = null。

2 个答案:

答案 0 :(得分:0)

您应该将{withCredentials: true}添加到所有请求中,而不仅仅是登录。它会强制http请求与它一起发送cookie,因此可以检索会话

答案 1 :(得分:0)

对我有用的解决方案是在Chrome中添加一些参数,这些参数仅对开发环境有用:

“ C:\ Program Files(x86)\ Google \ Chrome \ Application \ chrome.exe” --disable-web-security --user-data-dir =“ c:\ temp-chrome”