我有一个Web应用程序,它已经与Spring Security的几种不同配置一起使用。但是,这些差异配置都在我的applicationContext配置文件中设置。因此,为了在客户站点调整这些,必须在WAR文件中修改这些。如果客户手动修改WAR文件,那么在重新部署新WAR后,他们将丢失更改。
有没有办法外化此配置?有没有办法我可以用某种方式使用JNDI加载配置?
答案 0 :(得分:4)
这是一个有趣的问题。由于Spring Security应该在root webapp上下文中配置,因此您无法将其配置外部化到其他上下文。此外,您无法从上下文中更改配置资源集。所以,你应该从外面做:
您可以使用众所周知的文件系统位置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
file:///C:\config.xml
</param-value>
</context-param>
系统属性已在contextConfigLocation
中解析,因此您可以使用它:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
file:///${configPath}
</param-value>
</context-param>
和-DconfigPath=...
您可以覆盖XmlWebApplicationContext.getResource()
并实现您想要的任何内容:
public class MyXmlWebApplicationContext extends XmlWebApplicationContext {
private static final String JNDI_PREFIX = "jndi:/";
@Override
public Resource getResource(String location) {
if (location.startsWith(JNDI_PREFIX)) return getJndiResource(location);
else return super.getResource(location);
}
protected Resource getJndiResource(String location) { ... }
}
和
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
jndi:/...
</param-value>
</context-param>
<context-param>
<param-name>contextClass</param-name>
<param-value>com.example.MyXmlWebApplicationContext</param-value>
</context-param>
答案 1 :(得分:0)
您可以添加引用外部文件的org.springframework.beans.factory.config.PropertyPlaceholderConfigurer,然后使用$ {key}语法,而不使用Spring配置文件来引用外部化属性文件中的键/值对。
另一个解决方案是在web.xml中指定一个绝对路径来引用Spring contextConfigLocation。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/absolute_path/ldap.xml, /WEB-INF/context/dao-context.xml</param-value>
</context-param>
答案 2 :(得分:0)
或者,您可以使用org.springmodules.commons.configuration.CommonsConfigurationFactoryBean将您的配置存储和检索为数据库表中的键值对
<bean name="DatabaseConfiguration" class="org.apache.commons.configuration.DatabaseConfiguration">
<constructor-arg type="javax.sql.DataSource" ref="dataSource"/>
<constructor-arg index="1" value="CONFIG_TABLE_NAME"/>
<constructor-arg index="2" value="KEY_COLUMN_NAME"/>
<constructor-arg index="3" value="VALUE_COLUMN_NAME"/>
</bean>
答案 3 :(得分:0)
这是一个免费的配置工具:http://go.eeye.com/icwt,用于测试您的环境以获得强烈推荐的配置更新,如何配置本地操作系统(识别潜在的问题区域),识别有关APT的区域,并显示您的进程和代码签了。
答案 4 :(得分:0)
Spring提供了几种外部化选项 Spring配置详细信息到可以在。之外管理的属性文件中 部署的应用程序:
答案 5 :(得分:0)
这取决于。如果要修改授权,可以使用Requestmap并将所有授权配置保存在数据库中,然后使用外部引导数据定义提供不同的版本。