我正在尝试使用 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 作为服务器。请帮忙。