2017-02-21 4 views
2

Я пытаюсь использовать WSO2 5.3.0 в качестве сервера идентификации.Невозможно использовать WSO2 в качестве сервера идентификации, когда мое приложение работает в JBOSS EAP 7.0

Мое приложение работает в JBOSS EAP 7.0 и WSO2 работает в Tomcat, который поставляется с ним.

Я следил за этим document от ws02 и смог успешно выполнять SSO, когда приложение-образец работает в tomcat. Но когда я развертываю одно и то же приложение в JBOSS EAP 7.0, я получаю эту ошибку, когда попадал в URL-адрес приложения.

ОШИБКА [io.undertow.request] (задание по умолчанию-2) UT005023: запрос обработки исключений на /travevlocity.com: java.lang.IllegalStateException: UT010041: контекст сервлета уже инициализирован, вы можете только вызвать это метод из ServletContainerInitializer или контекста сервлета в io.undertow.servlet.spec.ServletContextImpl.ensureNotInitialized (ServletContextImpl.java:778) в io.undertow.servlet.spec.ServletContextImpl.addListener (ServletContextImpl.java:653) при гипергликемии .undertow.servlet.spec.ServletContextImpl.addListener (ServletContextImpl.java:632) на org.wso2.carbon.identity.sso.agent.SSOAgentFilter.init (SSOAgentFilter.java:57)

В WSO2 здесь используется метод init SSOAgentFilter.

public void init(FilterConfig fConfig) 
       throws ServletException 
      { 
       try 
        { 
         SSOAgentConfigs.initConfig(fConfig); 
         SSOAgentConfigs.initCheck(); 
         samlSSOManager = new SAML2SSOManager(); 
         openIdManager = new OpenIDManager(); 
         fConfig.getServletContext().addListener("org.wso2.carbon.identity.sso.agent.saml.SSOAgentHttpSessionListener"); 
        } catch(SSOAgentException e){ 
         LOGGER.log(Level.SEVERE, "An error has occurred", e); 
         throw e; 
        } 
      } 

Я думаю, что вопрос с JBOSS EAP 7.0, который использует в качестве отката реализации Servlet API. Ниже приведен фрагмент кода ServletContextImpl.

@Override 
    public void addListener(final Class<? extends EventListener> listenerClass) { 
     ensureNotInitialized(); 
     ensureNotProgramaticListener(); 
     if (ApplicationListeners.listenerState() != NO_LISTENER 
       && ServletContextListener.class.isAssignableFrom(listenerClass)) { 
      throw UndertowServletMessages.MESSAGES.cannotAddServletContextListener(); 
     } 
     InstanceFactory<? extends EventListener> factory = null; 
     try { 
      factory = deploymentInfo.getClassIntrospecter().createInstanceFactory(listenerClass); 
     } catch (Exception e) { 
      throw new IllegalArgumentException(e); 
     } 
     final ListenerInfo listener = new ListenerInfo(listenerClass, factory); 
     deploymentInfo.addListener(listener); 
     deployment.getApplicationListeners().addListener(new ManagedListener(listener, true)); 
    } 

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

Но при реализации Tomcat или других контейнеров это не проверяется. Следовательно, там хорошо работает.

Есть ли что-нибудь, что мы можем сделать, чтобы решить эту проблему. Я могу использовать только Jboss EAP 7.0 в качестве сервера в своем приложении. Пожалуйста помоги.

+0

У меня есть один и тот же вопрос. У вас были намеки в этом направлении? – quma

ответ

0

JBoss EAP 7.0 не использует Tomcat в качестве контейнера сервлетов, как в предыдущих версиях. Это может быть причиной несовместимости. Однако использование более новой версии зависимостей разрешит это.

<dependency> 
     <groupId>org.wso2.carbon.identity.agent.sso.java</groupId> 
     <artifactId>org.wso2.carbon.identity.sso.agent</artifactId> 
     <version>5.1.3</version> 
</dependency> 

Вы можете попробовать последнюю версию образца здесь, sso-agent-sample

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