Как узнать, был ли запрос на сервлет выполнен с использованием HTTP или HTTPS?
Я написал сервлет в Java, и я хотел бы знать, был ли запрос на этот сервлет выполнен с использованием HTTP или HTTPS.
Я думал, что могу использовать request.getProtocol()
, но он возвращает HTTP/1.1 для обоих методов.
Любые идеи?
Ответы
Ответ 1
HttpSerlvetRequest.isSecure() - это ответ. ServletContainer отвечает за возвращение true в следующих случаях:
- Если ServletContainer сам может принимать запросы на https.
- Если перед ServletContainer установлен LoadBalancer. И LoadBlancer получил запрос на https и отправил его в ServletContainer на простой http. В этом случае LoadBalancer отправляет заголовок X-SSL-Secure: true в ServletContainer, который должен выполняться.
Контейнер также должен сделать эти атрибуты запроса доступными, когда запрос получен в https:
- javax.servlet.http.sslsessionid
- javax.servlet.request.key_size
- javax.servlet.request.X509Certificate
Ответ 2
Вы не можете надежно зависеть от номеров портов.
Но вы можете зависеть от схемы:
Используйте request.getScheme(), чтобы узнать, есть ли https
.
Если это тогда, это безопасное соединение.
Я считаю, что это должно работать независимо от версии Tomcat
Ответ 3
isSecure. Обязательно проверьте унаследованные методы.
Ответ 4
https и http работает на разных портах. Таким образом, вы можете получить порт из запроса и узнать, из какого порта пришел запрос, и чтобы вы знали протокол. int port = request.getServerPort();