2

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

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

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

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

在 WSO2 中,这里是 SSOAgentFilter 的 init 方法。

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 作为服务器。请帮忙。

4

1 回答 1

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

于 2017-08-16T08:54:39.337 回答