2016-08-25 2 views
0

У меня есть сервлет Java, который находится за аппаратным балансиром нагрузки. Балансировщик нагрузки разрешает только запросы https. Проблема в том, что когда я получаю запрос в сервлете, я могу видеть только http, кажется, он был расшифрован к тому времени, когда он попадает в сервлет, что имеет смысл, потому что сервлет не должен беспокоиться о безопасности. Однако, когда я хочу отправить перенаправление в сервлет, запрос будет заблокирован балансировщиком нагрузки, потому что это будет http-запрос.Перенаправление не работает с Https

Я прочитал о некоторых решениях, и они все похожи на this one. В основном люди предлагают добавить фильтр сервлета, чтобы сначала поймать URL-адрес запроса.

Я пробовал, но это не сработало. Я не совсем понимаю, что до тех пор, пока сервлет не сможет узнать о фактическом запросе (http/https), как фильтр сервлета может помочь? Я также задаюсь вопросом, есть ли стандартное решение этой проблемы, поскольку я думаю, что это довольно часто.

ответ

0

HTTPS - это протокол HTTP только через SSL. Он шифрует только пакеты данных, переданные между вашим сервером &, используя сертификаты.

Ваш сервлет не должен беспокоить, какой основной механизм используется. Транспортный протокол - это договор между вашим клиентом & контейнер. Ваш сервлет остается прозрачным, как общение происходит на сетевом уровне.

Предупреждения о перенаправлении, которые вы получаете, могут быть из-за обеспечения безопасности. Как правило, большинство современных браузеров позволяют перейти от HTTP к HTTPS, но не наоборот.

Например, если ваша домашняя страница загружена в HTTPS, но ваш браузер блокирует асинхронные вызовы (любые аякс-вызовы), которые вы делаете через HTTP. Это делается для того, чтобы заставить вас использовать HTTPS на всех страницах вашего сайта.

Там может быть 2 сценария здесь, что вы можете проверить:

1) Вы получаете это предупреждение в браузере клиента. Как я уже объяснял выше, это может быть причиной вашей проблемы.

2) Подобно браузеру, ваш балансировщик нагрузки может выполнять любое такое принуждение безопасности.

Совет: Обычно, когда мы используем перенаправление в нашем сервлете или любом внутреннем коде. Не указывайте протокол явно, где бы вы ни находились. Это может быть в вашем коде перенаправления или в других местах. Даже в тегах анкерных вы создаете

Dont запись:.

<a href="http://mywebsite.com/page1"> page1 </a> 

Вместо этого пусть ваш браузер клиента обрабатывать протоколы (дополнительно, если URL находится в том же домене, а также использовать домен относительных URL-адрес Использовать абсолютные адреса только если они являются внешними по отношению к вашему сайту).

<a href="mywebsite.com/page1"> page1 </a> 

Этот способ, если тот же код сервлета/бэкэнд будет работать независимо от того, используете ли вы HTTPS или нет.

Еще одна вещь: HTTPS или HTTP через SSL находятся между вашим клиентом & уровнем веб-сервера. Ваш контейнер/сервер приложений не (или не должен) даже знать, что происходит между ними. Также рекомендуется использовать SSL между вашим веб-сервером & Appserver и иметь сквозное шифрование.

+0

Это именно то, что я понял и что сделал. Я просто 'response.sendRedirect ("/context/path/")'. Он будет перенаправлен на 'http: // hostname/context/path /'. Проблема заключается в том, что аппаратный балансировщик нагрузки не разрешает никаких HTTP-запросов. Поэтому после того, как браузер сделает такой запрос, он просто повесит там и, наконец, тайм-аут. Балансировщик нагрузки не то, что я могу коснуться и изменить. –

+0

Привет @JFreebird, где это перенаправление происходит? у вас браузер уже получает URL-адрес с http: // append? Если да, то есть где-то переписывание URL-адресов. Как правило, многие системы (особенно системы управления контентом) не хотят публиковать неработающие URL-адреса, и у них есть что-то, называемое механизмом перезаписи URL-адресов, который перезаписывает URL-адрес с добавлением имени домена и протокола (поэтому конвертирует относительные URL-адреса в абсолютные URL-адреса) , Проверьте, есть ли у вас что-нибудь на вашем уровне webservice или уровне балансировки нагрузки, который делает это. –

+0

Я отправляю перенаправление в свой сервлет, и браузер получает ответ, а затем пересылает URL-адрес перенаправления. Мой браузер получает https: // hostname/path redirect url, а не https. Я думаю, это потому, что сервлет знает только о http, когда он отправляет перенаправление. URL-адрес, отправленный из сервлета, завершен сам по себе, но это http. Поэтому я не думаю, что есть сломанный URL. –

1

Фактически вы можете узнать, был ли запрос на балансировку нагрузки http или https. Балансировщик нагрузки отправит вам определенные заголовки, которые сообщают вам об исходном запросе.

Для Ex, он отправит X-SSL-Secure: true Заголовок, если запрос на балансировку нагрузки был HTTPS.

См. Здесь.

How can I know if the request to the servlet was executed using HTTP or HTTPS?

+0

К сожалению, балансировка нагрузки не передала мне заголовок «X-SSL-Secure». –

+0

@ вы можете вставить здесь все заголовки, которые вы можете получить. Может быть, они отправляют некоторые другие заголовки. –

+0

Я проверил все заголовки, все из которых кажутся просто стандартными, не имеющими никакого отношения к безопасности. Это протокол для балансировщика нагрузки для установки определенного заголовка, когда он является https? –

Смежные вопросы