【问题标题】:Tomcat filter to manage sessionsTomcat 过滤器来管理会话
【发布时间】:2014-08-24 12:43:48
【问题描述】:

我有两个网络应用程序。应用 A 需要调用应用 B 的 REST 服务。 我想为应用程序 B 的其余服务添加一些安全性,所以我提出了这个工作流程:

当用户在应用程序 A 上进行身份验证时,它还会在应用程序 B 上执行身份验证,并在 B 上使用返回 cookie 的 servlet。 servlet 类似于:

    authenticate(postData): // throw Exceptions

    HttpSession session = request.getSession(true);

    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    cookie.setDomain(request.getContextPath());
    cookie.setDomain(request.getServerName());
    response.addCookie(cookie);

应用程序A将cookie值存储在用户会话中,然后应用程序A在需要时使用存储的cookie调用B。

在 B 上,我的休息服务前面有一个过滤器,它假设处理请求以检查这些请求是否经过身份验证。

过滤器执行以下操作:

    HttpServletRequest servletRequest = (HttpServletRequest) request;
    HttpSession session = servletRequest.getSession(false);

    if (null == session) {

        LOGGER.error("KO");
        HttpServletResponse servletResponse = (HttpServletResponse) request;
        servletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

    } else {
        // OK
        chain.doFilter(request, response);
    }

现在,我期待着

request.getSession(false);

将返回之前创建的会话,因为在身份验证中创建会话的是 Tomcat,但它不起作用。

我错过了什么?

【问题讨论】:

  • 那里的会话是否为空?
  • 是的,它是 null 并返回 UNAUTHORIZED

标签: java session tomcat cookies servlet-filters


【解决方案1】:

对不起,错误在这里清晰可见:

cookie.setDomain(request.getContextPath());
cookie.setDomain(request.getServerName());

现在变成了:

cookie.setPath(request.getContextPath());
cookie.setDomain(request.getServerName());

效果很好。

【讨论】:

    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2012-01-30
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多