Я пытаюсь настроить обработчик безопасности на ServletContext в Jetty после запуска Jetty.
Примерно так:
Handler[] contextHandlers = contexts.getHandlers();
for(Handler context : contextHandlers) {
if(context instanceof ServletContextHandler && ((ServletContextHandler) context).getContextPath().equals("/api")) {
context.setSecurityHandler(securityHandler);
break;
}
Но я получаю следующее исключение:
java.lang.IllegalStateException: STARTED
at org.eclipse.jetty.servlet.ServletContextHandler.setSecurityHandler (ServletContextHandler.java:483)
Почему это невозможно1014 *
Снимок экрана:
![enter image description here](https://i.stack.imgur.com/9oNoI.png)
РЕДАКТИРОВАНИЕ:
Я посмотрел исходный код и тамон проверяет наличие флага isStarted.Является ли недостатком безопасности добавление обработчика безопасности после старта?:
public void setSecurityHandler(SecurityHandler securityHandler)
{
if (isStarted())
throw new IllegalStateException("STARTED");
if (_securityHandler!=null)
_securityHandler.setHandler(null);
_securityHandler = securityHandler;
relinkHandlers();
}
(Причина, по которой я должен сделать это, немного сложнее, но я попытаюсь объяснить: я запускаю keycloakсервер за прокси-сервером, который доступен через мой сервер Jetty. Допустим, Jetty работает на хосте 1, а keycloak работает на хосте 2. Но во время установки ключа безопасности keycloak, независимо от того, какой хост настроен, keycloak разрешает аутентификацию на токенах, сгенерированных только из этого доменаПоэтому я хочу настроить хост Jetty в обработчике безопасности, который недоступен до запуска Jetty)