#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());
и это сработало нормально.