applet跨域訪問的安全性問題(java.security.AccessControlException:access denied)
作者:xcbeyond
瘋狂源自夢想,技術(shù)成就輝煌!微信公眾號:《程序猿技術(shù)大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗,樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項目的研發(fā)工作,涉及架構(gòu)設(shè)計、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對于Java、微服務(wù)、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗。
異常問題
之前在實際項目現(xiàn)場,出現(xiàn)過這么一種現(xiàn)象:
在BS報表系統(tǒng)中,需要對報表進行打印,點擊打印按鈕無任何反應(yīng),之前都好好的,為何突然不行啦?通過打開Java控制臺查看,發(fā)現(xiàn)出現(xiàn)如下錯誤ava.security.AccessControlException:access denied (java.net.SocketPermission..異常日志:
java.security.AccessControlException:access denied (java.net.SocketPermission http://report.xx.xx.com:8000 connect,resolve)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkConnect(Unknown Source)
at sun.plugin2.applet.Applet2SecurityManager.checkConnect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
這時才想起來,基于項目最終上線要求,對環(huán)境IP統(tǒng)一調(diào)整為域名后,才出現(xiàn)了這個問題,進行前后對比發(fā)現(xiàn),出現(xiàn)這個問題與調(diào)整為域名有密切關(guān)系。
原因分析
通過錯誤異常日志和報表打印的實現(xiàn)方式進行分析,原來報表打印是采用Java apllet方式實現(xiàn)的,而applet跨越訪問是會造成安全性問題的。
解決方法
通過查閱大量資源,總結(jié)可以通過以下兩個方面來解決:
1、在客戶端機器的JRE目錄下策略文件java.policy中添加授權(quán)
在JRE安裝目錄下的lib/security目錄下的java.policy文件中的grant {}中添加下面授權(quán):
(如:C:\Program Files\Java\jdk1.8.0_171\jre\lib\security\)
permission java.net.SocketPermission "*:*", "accept,connect,resolve";
其中*:*中第一個*表示允許的IP或域名,如果是*表示所有;第二個*表示端口或端口范圍,*表示所有端口,還可以是8080或8080-,如果是8080-則表示大于等于8080端口都允許。
"accept,connect,resolve"表示允許的操作:接受、連接、解析。
弊端:需要在所有使用該系統(tǒng)的客戶端上修改策略文件。
2、在應(yīng)用系統(tǒng)中建立屬于自己的策略文件
也可以建立自己的策略文件,如myPolicy.policy,在其中添加上面描述的授權(quán),再在lib/security目錄下的java.security文件中添加我們建立的策略文件:
policy.url.x=file:${java.home}/lib/security/myPolicy.policy
或者不用在java.security添加包含的策略文件,而是在啟動時帶一個參數(shù)
java -Djava.security.policy=myPolicy.policy
也是可以的。