我正在构建一个应在 Tomcat 和 WebSphere 上运行的 Web 应用程序,并且我已经设法将几乎所有差异都放入具有默认值的属性中,我可以覆盖这些默认值以部署在 Tomcat 服务器上。
我需要为身份验证提供程序 bean 做另一个覆盖...
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
if(isWebSphere()){
LOG.warn("Running on WebSphere... not overriding default authentication mechanism.");
return;
}
LOG.info("Running on Tomcat... overriding authentication provider bean ("+AUTHENTICATION_PROVIDER_BEAN+")");
if (beanFactory.containsBean(AUTHENTICATOR_BEAN) && beanFactory.containsBean(POPULATOR_BEAN) && beanFactory.containsBean(USERDETAIL_PROVIDER_BEAN)){
LdapAuthenticator authenticator = (LdapAuthenticator) beanFactory.getBean(AUTHENTICATOR_BEAN);
LdapAuthoritiesPopulator populator = (LdapAuthoritiesPopulator) beanFactory.getBean(POPULATOR_BEAN);
UserDetailProvider userDetailProvider = (UserDetailProvider) beanFactory.getBean(USERDETAIL_PROVIDER_BEAN);
ExtendedLdapAuthenticationProvider override = new ExtendedLdapAuthenticationProvider(authenticator, populator);
override.setUserDetailProvider(userDetailProvider);
beanFactory.registerSingleton(AUTHENTICATION_PROVIDER_BEAN, override);
} else {
throw new BeanCreationException("Could not find required beans to assemble overriding object for authentication...");
}
}
现在我的问题是如何实现 isWebSphere()
方法。我在想 Class.forName("someWebSphereSpecific")
,但有更好的方法吗?
最佳答案
ServletContext 包含一个方法 getServerInfo()
,对于我的 tomcat,它返回“Apache Tomcat/6.0.13”。我假设 webSphere 会返回一些同样可区分的东西。
您唯一的问题就是如何获取 ServletContext。如果您在 getServletConfig() 下查找 APIdoc 索引,您会发现它可以从很多地方获得。如果您的 servlet 是由您的 bean 工厂创建的 bean,那么您可以调用 servletBean.getServletConfig().getServerInfo()
。
如果您创建的 bean 均未授予您访问权限,您可以创建一个纯粹用于执行此检测的虚拟 servlet - 不是最简洁的,但它应该可以工作。
关于spring - 如何覆盖基于 web 服务器的 Spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2445879/