一、概念

环境变量这个概念不陌生, 就是操作系统的环境变量。

而系统变量就是java本身维护的变量。 通过 System.getProperty 的方式获取。

环境变量(Environment Variable )环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。

变量:可以随意给其赋值的一个存储单元。

环境:例如jvm这些都属于小软件,它们处于操作系统这个大软件中。

环境变量的作用:变量在任何程序中的作用都是“被赋值/被取值”!这个全局变量操作系统可以使用,其内的小软件也可以使用!

Linux中export的意思就是将局部变量设置为环境变量。

对于不同的操作系统来说,环境变量的处理可能会有一些不统一的地方,比如说:不区分大小写 等等。

二、获取

Java 获取环境变量的方式很简单:

System.getEnv()  得到所有的环境变量
System.getEnv(key) 得到某个环境变量的值
Map map = System.getenv(); 
Iterator it = map.entrySet().iterator(); 
while(it.hasNext()) 
{ 
  Entry entry = (Entry)it.next(); 
  System.out.print(entry.getKey()+"="); 
  System.out.println(entry.getValue()); 
} 

如果是windows 系统, 打印出来的值通过从 “我的电脑” 里看到的环境变量是一样的。

Java 获取环境变量的方式也很简单:

System.getProperties()  得到所有的系统变量
System.getProperty(key)  得到某个系统变量的值
Properties properties = System.getProperties(); 
Iterator it = properties.entrySet().iterator(); 
while(it.hasNext()) 
{ 
  Entry entry = (Entry)it.next(); 
  System.out.print(entry.getKey()+"="); 
  System.out.println(entry.getValue()); 
} 

系统变量除了可以获取之外, 还可以通过System.setProperty(key, value) 的方式设置自己需要的系统变量。
默认情况下, java 设置了哪些系统变量:

Java 获取环境变量
Java 获取环境变量的方式很简单: 
java.version Java 运行时环境版本
java.vendor Java 运行时环境供应商
java.vendor.url Java 供应商的 URL
java.home Java 安装目录
java.vm.specification.version Java 虚拟机规范版本
java.vm.specification.vendor Java 虚拟机规范供应商
java.vm.specification.name Java 虚拟机规范名称
java.vm.version Java 虚拟机实现版本
java.vm.vendor Java 虚拟机实现供应商
java.vm.name Java 虚拟机实现名称
java.specification.version Java 运行时环境规范版本
java.specification.vendor Java 运行时环境规范供应商
java.specification.name Java 运行时环境规范名称
java.class.version Java 类格式版本号
java.class.path Java 类路径
java.library.path 加载库时搜索的路径列表
java.io.tmpdir 默认的临时文件路径
java.compiler 要使用的 JIT 编译器的名称
java.ext.dirs 一个或多个扩展目录的路径
os.name 操作系统的名称
os.arch 操作系统的架构
os.version 操作系统的版本
file.separator 文件分隔符(在 UNIX 系统中是"/")
path.separator 路径分隔符(在 UNIX 系统中是":")
line.separator 行分隔符(在 UNIX 系统中是"/n")
user.name 用户的账户名称
user.home 用户的主目录
user.dir 用户的当前工作目录

三、区别

System.getEnv()和System.getProperties()的区别

从概念上讲,系统属性 和环境变量 都是名称与值之间的映射。两种机制都能用来将用户定义的信息传递给 Java 进程。环境变量产生更多的全局效应,因为它

们不仅对Java 子进程可见,而且对于定义它们的进程的所有子进程都是可见的。在不同的操作系统上,它们的语义有细微的差别,比如,不区分大小写。因为

这些原因,环境变量更可能有意料不到的副作用。最好在可能的地方使用系统属性。环境变量应该在需要全局效应的时候使用,或者在外部系统接口要求使用环

境变量时使用(比如 PATH)。

如下图:environmenTypeCode是准备金系统配置的系统变量,这个变量是访问数据字典要用的。

String denvironmenTypeCode = System.getProperty("environmenTypeCode");//kfTest

系统变量与环境变量-风君雪科技博客

四、应用

现在的用户系统的工作原理如下:
以准备金系统登录时,向用户系统发送请求为例:
因为准备金系统对接了用户系统,故在登录准备金系统时,首先会调用用户系统的方法,向用户系统发送请求。此处以getSvrByUser(String userCode)方法为例进行说明。该接口根据传入的用户代码获取其有访问权限的服务。该接口主要提供给门户系统使用。

4.1 服务端:

用户系统:用户系统会对外提供接口,等待其他系统的请求。

4.2 客户端:

准备金系统:准备金系统导入用户系统的jar包,通过调用jar包的方法,调用用户系统的功能。而所有对用户的请求,都封装在这个jar包中。
4.3 准备金系统会配置用户系统的环境变量(在数据字典有IP配置表ipserviceconfig,里面存了用户系统的环境变量及其对应的用户系统IP等信息)。
4.4 准备金系统进入登录页面,输入用户名、密码,点击登录,就会调用上述方法。
调用过程:
4.4.1 准备金系统用的是shiro进行的权限管理(此处不做重点说明SaaRealm类继承AuthorizingRealm类重写了父类的抽象方法doGetAuthenticationInfo(AuthenticationToken authenticationToken),而访问权限的校验,即getSvrByUser(String userCode)方法就是在这个方法中进行调用的)。
4.4.2 在调用方法用户系统方法时,会根据获取到的环境变量,从缓存中查询得到用户系统的url,如果缓存中没有数据,则会调用数据字典接口,查询得到用户系统的

url:http://10.129.202.56:7002/ims/BPSService。

并组织报文请求报文:

<GetSvrByUserReqPacket>
<requestbody>
<REQUEST_TYPE>7050014</REQUEST_TYPE>
<USERCODE>A330000036</USERCODE>
</requestbody>
</GetSvrByUserReqPacket>

得到返回报文

<ResponseXml>
<responsehead>
<uuid></uuid>
<timestamp>2020-01-14 16:05:31.196 CST</timestamp>
<request_type></request_type>
<response_code>1</response_code>
<server_version></server_version>
<sender>0205</sender>
<error_message>成功</error_message>
</responsehead>
<responsebody>
<SVRINFO class="list">
<SvrInfo>
<SVRCODE>zzbj</SVRCODE>
<SVRNAME>人保再准备金系统</SVRNAME>
<WEBNAME>zzbj</WEBNAME>
<COMPANYCODE>33000000</COMPANYCODE>
<SVRCODEINCOMPANY>zzbj</SVRCODEINCOMPANY>
<SVRIP>192.168.0.1</SVRIP>
<SVRPORT>8080</SVRPORT>
<SVRTYPE>3</SVRTYPE>
<SVRPRIORITY></SVRPRIORITY>
<SVRLOGINMETHOD>nameAndPwd</SVRLOGINMETHOD>
<MANAGERIGHTSTATUS>1</MANAGERIGHTSTATUS>
<MANAGEMENUSTATUS>1</MANAGEMENUSTATUS>
<MANAGELOGINSTATUS>1</MANAGELOGINSTATUS>
<MANAGEACCSTATUS>1</MANAGEACCSTATUS>
<ACCSYNCSTATUS>1</ACCSYNCSTATUS>
<ACCMSGSYNCSTATUS>1</ACCMSGSYNCSTATUS>
<ACCLOGINSTATUS>1</ACCLOGINSTATUS>
</SvrInfo>
</SVRINFO>
</responsebody>
</ResponseXml>

然后根据准备金系统就可以对得到的返回信息进行自己需要的处理。准备金系统调用这个方法只是用作输出了服务代码。下面的:
用户登录检查(按用户名和密码形式)—非集成单点(checkLoginByPwd)用来做权限等校验,就不再说明。
此接口为用户登录非集成单点的业务系统时使用。
服务器端校验内容如下:
(1) 账户所属服务是否存在或是否处于有效状态。
(2) 账户是否存在或是否处于有效状态。
(3) 用户名、密码是否一致。
(4) 密码是否过期。
(5) 账户是否过期。
(6) 账户是否有登录权限。
(7) 登录用户是否存在身份证。–2013年2季度版本实现
全部校验通过,则返回成功代码,校验不通过,返回错误代码及提示信息。

/**
* 用于认证
* @param authenticationToken 用于认证
* @return 用于认证
* @throws AuthenticationException 用于认证
*/
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
String userName = authenticationToken.getPrincipal().toString();
String password = new String((char[])authenticationToken.getCredentials());
String error_message = "";
System.out.println(userName +"尝试登陆 他的密码是 " + password);
boolean b = false;
try {

List<SvrInfo> scodeList = saa.getSvrByUser(userName);

for(SvrInfo info:scodeList){
// boolean sb = saa.checkLoginByPwd(info.getSVRCODE(),userName,password,"nameAndPwd");
System.out.println(" ---svcode---- "+info.getSVRCODE());

}
b = saa.checkLoginByPwd("casServer",userName,password,"nameAndPwd");
} catch (Exception e) {
error_message = e.getMessage();
}
if(!b){
throw new UnknownAccountException(error_message);
}
return new SimpleAuthenticationInfo(userName,password,getName());
}

五、补充

1 . 在.bat ; .cmd 或 .sh 中会通过 set 的方式设置一些变量,比如weblogic 的 setDomainEnv.cmd

set SUN_JAVA_HOME=C:OracleMiddlewarejdk160_21

这里设置的是环境变量。

2. 在log4j 的配置中, 有时会配置log file 的产生路径。 比如 ${LOG_DIR}/logfile.log, 这里的LOG_DIR 是被系统属性的变量替换的。

如果错过太阳时你流了泪,那你也要错过群星了。
在所有的矛盾中,要优先解决主要矛盾,其他矛盾也就迎刃而解。
不要做个笨蛋,为失去的郁郁寡欢,聪明的人,已经找到了解决问题的办法,或正在寻找。