Фильтр Tomcat для управления сеансами

#java #session #tomcat #cookies #servlet-filters

#java #сессия #tomcat #файлы cookie #сервлет-фильтры

Вопрос:

У меня есть два веб-приложения. Приложению A необходимо вызвать службы rest приложения B. Я хотел обеспечить некоторую безопасность служб rest приложения B, поэтому я разработал этот рабочий процесс:

Когда пользователь проходит аутентификацию в приложении A, он выполняет также аутентификацию в приложении B с помощью сервлета на B, который возвращает cookie. Сервлет представляет собой что-то вроде:

     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 у меня есть фильтр перед моими службами rest, который предполагает обработку запросов, чтобы проверить, аутентифицированы ли они или нет.

Фильтр выполняет что-то вроде:

     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 создал сеанс при аутентификации, но он не работает.

Чего мне не хватает?

Комментарии:

1. Является ли сессия нулевой?

2. Да, это значение равно null и возвращает НЕСАНКЦИОНИРОВАННЫЙ

Ответ №1:

Извините, ошибка была здесь явной и видимой:

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

Теперь это стало:

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

и это сработало нормально.