Java 如何将OS环境变量连接到Spring Web app项目中application.properties中的占位符?

Java 如何将OS环境变量连接到Spring Web app项目中application.properties中的占位符?,java,spring,spring-mvc,spring-security,spring-data,Java,Spring,Spring Mvc,Spring Security,Spring Data,1) 我创建了前面提到的环境文件 我创建了一个名为Prod.env的文件,并输入了以下内容 SPRING_DATASOURCE_URL="jdbc:mysql://5.6.7.8:3306/ab?autoReconnect=true&characterEncoding=utf8" SPRING_DATASOURCE_USERNAME="root" SPRING_DATASOURCE_PASSWORD="IWin" 然后我执行了这个命令export$(cat Prod.env

1) 我创建了前面提到的环境文件

  • 我创建了一个名为
    Prod.env
    的文件,并输入了以下内容

    SPRING_DATASOURCE_URL="jdbc:mysql://5.6.7.8:3306/ab?autoReconnect=true&characterEncoding=utf8"
    SPRING_DATASOURCE_USERNAME="root"
    SPRING_DATASOURCE_PASSWORD="IWin"
    
  • 然后我执行了这个命令
    export$(cat Prod.env|xargs)

2) 然后,我用以下代码在
WEB-INF
下创建了
application.properties

spring.datasource.driver-class-name:com.mysql.jdbc.Driver
spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
3) 然后在
spring security.xml中

  <b:bean id="mappings" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <b:property name="location">
            <b:value>/WEB-INF/application.properties</b:value>
        </b:property>
  </b:bean> 
  <b:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <b:property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
        <b:property name="url" value="${spring.datasource.url}" />
        <b:property name="username" value="${spring.datasource.username}" />
        <b:property name="password" value="${spring.datasource.password}" />
  </b:bean>
我想要实现的是: 通过application.properties(或在spring-security.xml中进行一些配置)访问环境变量,但不使用java代码。我错过了什么

我搜索了几个问题,但没有一个能解释清楚。请帮忙


注意:我的不是spring boot项目。这是正常的Spring 4.0.3 web应用程序

通常的方法是,应用程序不应该知道任何有关环境类型的信息(ENV、INTP、PROD等)。这意味着,不要指定环境(stage)名称,而是使用与属性文件相同的名称,将所需版本的文件放入类路径。例如,在DEV环境中,将application.properties的DEV版本放在类路径中;在PROD环境中,将application.properties的PROD版本放在类路径中

在您的情况下,我建议您从WEB-INF中删除application.properties并将其置于WAR之外(如果您使用EAR,也应置于EAR之外)。将其放入应用程序的类路径或应用程序服务器的类路径,并按如下方式配置bean:

  <b:bean id="mappings" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <b:property name="location">
            <b:value>classpath*:application.properties</b:value>
        </b:property>
  </b:bean> 
spring.datasource.url="jdbc:mysql://5.6.7.8:3306/ab?autoReconnect=true&amp;characterEncoding=utf8"
spring.datasource.username=root
spring.datasource.password=IWin

不要将application.properties放入WAR,而是放入应用程序服务器的类路径。

通常的方法是,应用程序不应该知道任何有关环境类型的信息(ENV、INTP、PROD等)。这意味着,不要指定环境(stage)名称,而是使用与属性文件相同的名称,将所需版本的文件放入类路径。例如,在DEV环境中,将application.properties的DEV版本放在类路径中;在PROD环境中,将application.properties的PROD版本放在类路径中

在您的情况下,我建议您从WEB-INF中删除application.properties并将其置于WAR之外(如果您使用EAR,也应置于EAR之外)。将其放入应用程序的类路径或应用程序服务器的类路径,并按如下方式配置bean:

  <b:bean id="mappings" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <b:property name="location">
            <b:value>classpath*:application.properties</b:value>
        </b:property>
  </b:bean> 
spring.datasource.url="jdbc:mysql://5.6.7.8:3306/ab?autoReconnect=true&amp;characterEncoding=utf8"
spring.datasource.username=root
spring.datasource.password=IWin

不要将application.properties放入WAR,而是放入应用服务器的类路径。

可能您已经知道,
export
命令必须在每次打开终端时运行。要持久化这些环境变量,请将它们添加到.profile或.bashrc。将密码以明文形式保存到env-vars或纯文本文件中是一个很大的安全问题。@LuisMuñoz那么,如何在不在文本文件中输入密码的情况下设置env-vars呢。如果我使用散列密码并将其放入文本文件中,然后设置enn vars,每次使用加密密码时,我都必须对其进行解密。除了这些,还有其他选择吗?看起来是个不错的选择。我想一次解决这个问题。我首先计划将env变量添加到bashshell中,这样就可以永久地添加它,而不必每次都设置它。为此,我按照-->打开/etc/profile并添加
export$(cat Prod.env | xargs)
作为最后一行,保存并重新启动bash。我没看到那些士兵在那里。如何永久设置env vars,使我不必在每次打开Terminal时都运行export命令,而不用在您的主配置文件上执行此操作
$home/.profile
。另一种方式是每个用户都可以使用密码;)。只需为每个var添加一个
export
,而不使用cat之类的工具。然后运行
source$HOME/.profile
或登出登入。可能您已经知道,
export
命令必须在每次打开终端时运行。要持久化这些环境变量,请将它们添加到.profile或.bashrc。将密码以明文形式保存到env-vars或纯文本文件中是一个很大的安全问题。@LuisMuñoz那么,如何在不在文本文件中输入密码的情况下设置env-vars呢。如果我使用散列密码并将其放入文本文件中,然后设置enn vars,每次使用加密密码时,我都必须对其进行解密。除了这些,还有其他选择吗?看起来是个不错的选择。我想一次解决这个问题。我首先计划将env变量添加到bashshell中,这样就可以永久地添加它,而不必每次都设置它。为此,我按照-->打开/etc/profile并添加
export$(cat Prod.env | xargs)
作为最后一行,保存并重新启动bash。我没看到那些士兵在那里。如何永久设置env vars,使我不必在每次打开Terminal时都运行export命令,而不用在您的主配置文件上执行此操作
$home/.profile
。另一种方式是每个用户都可以使用密码;)。只需为每个var添加一个
export
,而不使用cat之类的工具。然后运行
source$HOME/.profile
或登出登入。1)那么,我根本不需要数据源bean吗?2) 如果我不想在类路径中的application.properties中未加密密码,该怎么办?3) 如何识别我的类路径并放置application.properties?1)我已经扩展了答案。2) 密码在应用服务器的类路径中时更安全,因为只有服务器管理员可以访问它。如果您在应用程序中包含密码,那么在构建应用程序时,您必须更早地了解密码。这就是为什么会有更多的人访问你的密码。你可以让密码不那么容易阅读。但是请记住,任何有权访问服务器并拥有与您的应用程序相同权限的人都能够以与应用程序相同的方式读取/解密它们。尽管如此,至少对于无法访问服务器的用户来说,让密码不那么容易读取是有意义的。一种可能的方法是使用Spring vault。请参阅此处或此处的更多详细信息。到3):类路径依赖