applet跨域訪問的安全性問題(java.security.AccessControlException:access denied)
作者:xcbeyond
瘋狂源自夢想,技術(shù)成就輝煌!微信公眾號(hào):《程序猿技術(shù)大咖》號(hào)主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對(duì)于Java、微服務(wù)、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。
異常問題
之前在實(shí)際項(xiàng)目現(xiàn)場,出現(xiàn)過這么一種現(xiàn)象:
在BS報(bào)表系統(tǒng)中,需要對(duì)報(bào)表進(jìn)行打印,點(diǎn)擊打印按鈕無任何反應(yīng),之前都好好的,為何突然不行啦?通過打開Java控制臺(tái)查看,發(fā)現(xiàn)出現(xiàn)如下錯(cuò)誤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)
這時(shí)才想起來,基于項(xiàng)目最終上線要求,對(duì)環(huán)境IP統(tǒng)一調(diào)整為域名后,才出現(xiàn)了這個(gè)問題,進(jìn)行前后對(duì)比發(fā)現(xiàn),出現(xiàn)這個(gè)問題與調(diào)整為域名有密切關(guān)系。
原因分析
通過錯(cuò)誤異常日志和報(bào)表打印的實(shí)現(xiàn)方式進(jìn)行分析,原來報(bào)表打印是采用Java apllet方式實(shí)現(xiàn)的,而applet跨越訪問是會(huì)造成安全性問題的。
解決方法
通過查閱大量資源,總結(jié)可以通過以下兩個(gè)方面來解決:
1、在客戶端機(jī)器的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";
其中*:*中第一個(gè)*表示允許的IP或域名,如果是*表示所有;第二個(gè)*表示端口或端口范圍,*表示所有端口,還可以是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添加包含的策略文件,而是在啟動(dòng)時(shí)帶一個(gè)參數(shù)
java -Djava.security.policy=myPolicy.policy
也是可以的。