Как я могу узнать, был ли запрос к сервлету выполнен с использованием HTTP или HTTPS?


Я написал сервлет на Java, и я хотел бы знать, был ли запрос к этому сервлету выполнен с использованием HTTP или HTTPS.

Я думал, что могу использовать request.getProtocol() но он возвращает HTTP / 1.1 на обоих методах.

какие идеи?

4 62

4 ответа:

HttpSerlvetRequest.isSecure() ответ. ServletContainer отвечает за возврат true в следующих случаях:

  • если ServletContainer может сам принимать запросы на HTTPS.
  • если есть LoadBalancer перед ServletContainer. И, LoadBlancer получил запрос на https и отправил то же самое в ServletContainer на обычный http. В этом случае Балансировщик нагрузки направляет X-SSL-Secure: true заголовок к ServletContainer, который должен быть соблюден.

контейнер также должен сделать эти атрибуты запроса доступными, когда запрос получен на https:

  • javax.сервлет.http.sslsessionid
  • javax.сервлет.запрос.key_size
  • javax.сервлет.запрос.X509Certificate

вы не можете надежно зависеть от номеров портов.
Но вы можете зависеть от схемы:

использование: запрос.getScheme() чтобы увидеть, если это https.

Если это так, то это безопасное соединение.

Я считаю, что это должно работать независимо от версии Tomcat

isSecure. Обязательно проверьте унаследованные методы.

https и http работает на разных портах. Таким образом, вы можете получить порт из запроса и узнать, с какого порта пришел запрос, и чтобы вы могли знать протокол. int port=запрос.getServerPort();