我正在尝试使用WSO2 5.3.0作为标识服务器。

我的应用程序在JBOSS EAP 7.0中运行,而WSO2在其随附的Tomcat中运行。

我已经遵循了ws02的document,并且当示例应用程序在tomcat中运行时能够成功执行SSO。但是,当我将相同的应用程序部署到JBOSS EAP 7.0时,点击应用程序URL时会出现此错误。

错误[io.undertow.request](默认任务2)UT005023:对/travevlocity.com的异常处理请求:java.lang.IllegalStateException:UT010041:Servlet上下文已经初始化,您只能从ServletContainerInitializer调用此方法。或ServletContextListener
在io.undertow.servlet.spec.ServletContextImpl.ensureNotInitialized(ServletContextImpl.java:778)
    在io.undertow.servlet.spec.ServletContextImpl.addListener(ServletContextImpl.java:653)
    在io.undertow.servlet.spec.ServletContextImpl.addListener(ServletContextImpl.java:632)
    在org.wso2.carbon.identity.sso.agent.SSOAgentFilter.init(SSOAgentFilter.java:57)

在WSO2中,这是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,它使用undertow作为servlet api实现。这是undertow的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作为服务器。请帮忙。

最佳答案

JBoss EAP 7.0不像以前的版本那样使用Tomcat作为其servlet容器。这可能是不兼容的原因。
但是,使用较新版本的依赖关系将解决此问题。

<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

10-07 20:15