系统变量与环境变量
一、概念
環(huán)境變量這個概念不陌生, 就是操作系統(tǒng)的環(huán)境變量。
而系統(tǒng)變量就是java本身維護的變量。 通過 System.getProperty 的方式獲取。
環(huán)境變量(Environment Variable )環(huán)境變量是在操作系統(tǒng)中一個具有特定名字的對象,它包含了一個或者多個應(yīng)用程序所將使用到的信息。
變量:可以隨意給其賦值的一個存儲單元。
環(huán)境:例如jvm這些都屬于小軟件,它們處于操作系統(tǒng)這個大軟件中。
環(huán)境變量的作用:變量在任何程序中的作用都是“被賦值/被取值”!這個全局變量操作系統(tǒng)可以使用,其內(nèi)的小軟件也可以使用!
Linux中export的意思就是將局部變量設(shè)置為環(huán)境變量。
對于不同的操作系統(tǒng)來說,環(huán)境變量的處理可能會有一些不統(tǒng)一的地方,比如說:不區(qū)分大小寫 等等。
二、獲取
Java 獲取環(huán)境變量的方式很簡單:
System.getEnv() 得到所有的環(huán)境變量
System.getEnv(key) 得到某個環(huán)境變量的值
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 系統(tǒng), 打印出來的值通過從 “我的電腦” 里看到的環(huán)境變量是一樣的。
Java 獲取環(huán)境變量的方式也很簡單:
System.getProperties() 得到所有的系統(tǒng)變量
System.getProperty(key) 得到某個系統(tǒng)變量的值
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());
}
系統(tǒng)變量除了可以獲取之外, 還可以通過System.setProperty(key, value) 的方式設(shè)置自己需要的系統(tǒng)變量。
默認情況下, java 設(shè)置了哪些系統(tǒng)變量:
Java 獲取環(huán)境變量 Java 獲取環(huán)境變量的方式很簡單: java.version Java 運行時環(huán)境版本 java.vendor Java 運行時環(huán)境供應(yīng)商 java.vendor.url Java 供應(yīng)商的 URL java.home Java 安裝目錄 java.vm.specification.version Java 虛擬機規(guī)范版本 java.vm.specification.vendor Java 虛擬機規(guī)范供應(yīng)商 java.vm.specification.name Java 虛擬機規(guī)范名稱 java.vm.version Java 虛擬機實現(xiàn)版本 java.vm.vendor Java 虛擬機實現(xiàn)供應(yīng)商 java.vm.name Java 虛擬機實現(xiàn)名稱 java.specification.version Java 運行時環(huán)境規(guī)范版本 java.specification.vendor Java 運行時環(huán)境規(guī)范供應(yīng)商 java.specification.name Java 運行時環(huán)境規(guī)范名稱 java.class.version Java 類格式版本號 java.class.path Java 類路徑 java.library.path 加載庫時搜索的路徑列表 java.io.tmpdir 默認的臨時文件路徑 java.compiler 要使用的 JIT 編譯器的名稱 java.ext.dirs 一個或多個擴展目錄的路徑 os.name 操作系統(tǒng)的名稱 os.arch 操作系統(tǒng)的架構(gòu) os.version 操作系統(tǒng)的版本 file.separator 文件分隔符(在 UNIX 系統(tǒng)中是"/") path.separator 路徑分隔符(在 UNIX 系統(tǒng)中是":") line.separator 行分隔符(在 UNIX 系統(tǒng)中是"/n") user.name 用戶的賬戶名稱 user.home 用戶的主目錄 user.dir 用戶的當前工作目錄
三、區(qū)別
System.getEnv()和System.getProperties()的區(qū)別
從概念上講,系統(tǒng)屬性 和環(huán)境變量 都是名稱與值之間的映射。兩種機制都能用來將用戶定義的信息傳遞給 Java 進程。環(huán)境變量產(chǎn)生更多的全局效應(yīng),因為它
們不僅對Java 子進程可見,而且對于定義它們的進程的所有子進程都是可見的。在不同的操作系統(tǒng)上,它們的語義有細微的差別,比如,不區(qū)分大小寫。因為
這些原因,環(huán)境變量更可能有意料不到的副作用。最好在可能的地方使用系統(tǒng)屬性。環(huán)境變量應(yīng)該在需要全局效應(yīng)的時候使用,或者在外部系統(tǒng)接口要求使用環(huán)
境變量時使用(比如 PATH)。
如下圖:environmenTypeCode是準備金系統(tǒng)配置的系統(tǒng)變量,這個變量是訪問數(shù)據(jù)字典要用的。
String denvironmenTypeCode = System.getProperty("environmenTypeCode");//kfTest
四、應(yīng)用
現(xiàn)在的用戶系統(tǒng)的工作原理如下:
以準備金系統(tǒng)登錄時,向用戶系統(tǒng)發(fā)送請求為例:
因為準備金系統(tǒng)對接了用戶系統(tǒng),故在登錄準備金系統(tǒng)時,首先會調(diào)用用戶系統(tǒng)的方法,向用戶系統(tǒng)發(fā)送請求。此處以getSvrByUser(String userCode)方法為例進行說明。該接口根據(jù)傳入的用戶代碼獲取其有訪問權(quán)限的服務(wù)。該接口主要提供給門戶系統(tǒng)使用。
4.1 服務(wù)端:
用戶系統(tǒng):用戶系統(tǒng)會對外提供接口,等待其他系統(tǒng)的請求。
4.2 客戶端:
準備金系統(tǒng):準備金系統(tǒng)導入用戶系統(tǒng)的jar包,通過調(diào)用jar包的方法,調(diào)用用戶系統(tǒng)的功能。而所有對用戶的請求,都封裝在這個jar包中。
4.3 準備金系統(tǒng)會配置用戶系統(tǒng)的環(huán)境變量(在數(shù)據(jù)字典有IP配置表ipserviceconfig,里面存了用戶系統(tǒng)的環(huán)境變量及其對應(yīng)的用戶系統(tǒng)IP等信息)。
4.4 準備金系統(tǒng)進入登錄頁面,輸入用戶名、密碼,點擊登錄,就會調(diào)用上述方法。
調(diào)用過程:
4.4.1 準備金系統(tǒng)用的是shiro進行的權(quán)限管理(此處不做重點說明SaaRealm類繼承AuthorizingRealm類重寫了父類的抽象方法doGetAuthenticationInfo(AuthenticationToken authenticationToken),而訪問權(quán)限的校驗,即getSvrByUser(String userCode)方法就是在這個方法中進行調(diào)用的)。
4.4.2 在調(diào)用方法用戶系統(tǒng)方法時,會根據(jù)獲取到的環(huán)境變量,從緩存中查詢得到用戶系統(tǒng)的url,如果緩存中沒有數(shù)據(jù),則會調(diào)用數(shù)據(jù)字典接口,查詢得到用戶系統(tǒng)的
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>人保再準備金系統(tǒng)</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>
然后根據(jù)準備金系統(tǒng)就可以對得到的返回信息進行自己需要的處理。準備金系統(tǒng)調(diào)用這個方法只是用作輸出了服務(wù)代碼。下面的:
用戶登錄檢查(按用戶名和密碼形式)—非集成單點(checkLoginByPwd)用來做權(quán)限等校驗,就不再說明。
此接口為用戶登錄非集成單點的業(yè)務(wù)系統(tǒng)時使用。
服務(wù)器端校驗內(nèi)容如下:
(1) 賬戶所屬服務(wù)是否存在或是否處于有效狀態(tài)。
(2) 賬戶是否存在或是否處于有效狀態(tài)。
(3) 用戶名、密碼是否一致。
(4) 密碼是否過期。
(5) 賬戶是否過期。
(6) 賬戶是否有登錄權(quán)限。
(7) 登錄用戶是否存在身份證。--2013年2季度版本實現(xiàn)
全部校驗通過,則返回成功代碼,校驗不通過,返回錯誤代碼及提示信息。
/**
* 用于認證
* @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 的方式設(shè)置一些變量,比如weblogic 的 setDomainEnv.cmd
set SUN_JAVA_HOME=C:OracleMiddlewarejdk160_21
這里設(shè)置的是環(huán)境變量。
2. 在log4j 的配置中, 有時會配置log file 的產(chǎn)生路徑。 比如 ${LOG_DIR}/logfile.log, 這里的LOG_DIR 是被系統(tǒng)屬性的變量替換的。
如果錯過太陽時你流了淚,那你也要錯過群星了。
在所有的矛盾中,要優(yōu)先解決主要矛盾,其他矛盾也就迎刃而解。
不要做個笨蛋,為失去的郁郁寡歡,聰明的人,已經(jīng)找到了解決問題的辦法,或正在尋找。
總結(jié)
- 上一篇: 惯性张量( Inertia Tensor
- 下一篇: 激活函数(ReLU, Swish, Ma