系统变量与环境变量
一、概念
環境變量這個概念不陌生, 就是操作系統的環境變量。
而系統變量就是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 是被系統屬性的變量替換的。
如果錯過太陽時你流了淚,那你也要錯過群星了。
在所有的矛盾中,要優先解決主要矛盾,其他矛盾也就迎刃而解。
不要做個笨蛋,為失去的郁郁寡歡,聰明的人,已經找到了解決問題的辦法,或正在尋找。
總結
- 上一篇: 惯性张量( Inertia Tensor
- 下一篇: 激活函数(ReLU, Swish, Ma