Ответ на вопрос можно найти в org.apache.catalina.connector.CoyoteAdapter#postParseRequest
Следующий код взят из tomcat 8.5:
String sessionID;
if (request.getServletContext().getEffectiveSessionTrackingModes()
.contains(SessionTrackingMode.URL)) {
// Get the session ID if there was one
sessionID = request.getPathParameter(
SessionConfig.getSessionUriParamName(
request.getContext()));
if (sessionID != null) {
request.setRequestedSessionId(sessionID);
request.setRequestedSessionURL(true);
}
}
// Look for session ID in cookies and SSL session
parseSessionCookiesId(request);
parseSessionSslId(request);
sessionID = request.getRequestedSessionId();
Происходит следующее:
- Если tomcat разрешено использовать отслеживание сеанса URL, он пытается найти идентификатор сеанса в запросе URL
- Если разрешено использовать отслеживание cookie - он ищет идентификатор сеанса в файлах cookie. Он имеет приоритет независимо от того, был ли в запросе идентификатор сеанса или нет.
- (Не часть вашего вопроса, но для полноты) Отслеживание сеанса SSL используется тогда и только тогда, когда это единственный разрешенный режим отслеживания. В противном случае оно будет проигнорировано.
Я не знаю, почему отслеживание URL не было извлечено в отдельном методе, как в режимах отслеживания SSL и Cookie, но они выглядят почти одинаково:
- Проверьте, включен ли режим
- Попробуйте найти SessionId
- Установить идентификатор сеанса в объекте запроса.