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

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

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

Есть идеи?

Ответы [ 4 ]

95 голосов
/ 21 ноября 2011

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

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

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

  • javax.servlet.http.sslsessionid
  • javax.servlet.request.key_size
  • javax.servlet.request.X509Certificate
27 голосов
/ 20 ноября 2011

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

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

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

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

10 голосов
/ 20 ноября 2011

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

0 голосов
/ 20 ноября 2011

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

...