我正在尝试使用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