oracle JDeveleper 10g 下开发applet + adf 应用程序,在AppletView下运行正常,
但在Embedded OC4J Server下运行报以下错误:
错误1:
java.lang.ExceptionInInitializerError
at oracle.jbo.mom.DefinitionManager.<init>(DefinitionManager.java:146)
at oracle.jbo.uicli.mom.JUMetaObjectManager.<init>(JUMetaObjectManager.java:76)
at oracle.jbo.uicli.mom.JUMetaObjectManager.getJUMom(JUMetaObjectManager.java:251)
at sdsc.base.flow.FlowApplet.prepDatabase(FlowApplet.java:202)
at sdsc.base.flow.FlowApplet.actionPerformed(FlowApplet.java:177)
at java.awt.Button.processActionEvent(Unknown Source)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.security.AccessControlException: access denied (java.util.PropertyPermission oracle.xdkjava.compatibility.version read)
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.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)
at oracle.xml.parser.v2.XMLParser.<clinit>(XMLParser.java:988)
... 15 more
解决方案:在${java.home}/lib/security/java.policy文件中增加一条,
permission java.util.PropertyPermission "oracle.xdkjava.compatibility.version", "read";
其中,${java.home}: 引用JRE所安装的目录位置(以下该变量均是此含义)。
问题2:
问题1解决后,新问题出现:
oracle.jbo.JboException:JBO-29000:unexcepted exception caught:java.security.AccessControlException,msg=access denied(java.lang.RuntimePermission accessClassInPackage.sun.security.provider)
at oracle.jbo.common.ampool.PoolMgr.findPool(PoolMgr.java:510)
at oracle.adf.model.bc4j.DataControlFactoryImpl.findOrCreateSessionCookie(DataControlFactoryImpl.java:136)
at oracle.adf.model.bcrj.DataControlFactoryImpl.createSession(DataContorlFactoryImpl.java:221)
at orcale.adf.model.binding.DCDataControlReference.getDataControl(DCDataControlReference.java:63)
at oracle.adf.model.BindingContext.get(BindingContext.java:411)
...
...
...
at java.awt.EventDispatchThred.run(Unknown Source)
##Detail 0##
java.security.AccessControlException:access denied(java.lang.RuntimePermission accessClassInPackage.sun.security.provider)
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.checkPackageAccess(Unknown Source)
...
...
...
at java.awt.EventDispathThread.run(Unknown Source)
解决方案:在${java.home}/lib/security/java.policy文件中增加一条,
permission java.lang.RuntimePermission "accessClassInPackage.sun.*";
问题3:
问题2解决后,新问题出现:
JBO-30003:因出现下列异常,应用程序池(model.AppModuleLocal)检出应用程序模块时失败:
oracle.jbo.JboException:JBO-29000:JBO-29000:JBO-29000:access denied(java.net.SocketPermission 10.10.100.4:1521 connect,resolve)
at oracle.jbo.common.ampool.ApplicationPoolImpl.doCheckout(ApplicationPoolImpl.java:1772)
...
...
...
at java.awt.EventDispatchThread.run(Unknown Source)
##Detail 0##
oracle.jbo.JboException:JBO-29000:JBO-29000:access denied(java.net.SocketPermission 10.10.100.4:1521 connect,resolve)
at oracle.jbo.pool.ResourcePool.useResource(ResourcePool.java:337)
...
...
...
at java.awt.EventDispatchThread.run(Unknown Source)
##Detail 0##
oracle.jbo.JboException:JBO-29000:access denied(java.net.SocketPermission 10.10.100.4:1521 connect,resolve)
at oracle.jbo.pool.ResourcePool.createResource(ResourcePool.java:541)
at oracle.jbo.pool.ResourcePool.useResource(ResourcePool.java:327)
...
...
...
at java.awt.EventDispatchThread.run(Unknown Source)
##Detail 0##
java.security.AccessControlException:access denied(java.net.SocketPermission 10.10.100.4:1521 connect,resolve)
at java.security.AccessControlContext.checkPermission(Unknown Source)
...
...
...
at java.awt.EventDispatchThread.run(Unknown Source)
解决方案:在${java.home}/lib/security/java.policy文件中增加一条,
permission java.net.SocketPermission "10.10.100.4:1521", "connect,resolve";
总结:
在${java.home}/lib/security/java.policy文件中一共增加三条,
permission java.util.PropertyPermission "oracle.xdkjava.compatibility.version", "read";
permission java.lang.RuntimePermission "accessClassInPackage.sun.*";
permission java.net.SocketPermission "10.10.100.4:1521", "connect,resolve";
推论:
如果其他程序遇到了类似安全设置上的问题,其错误提示也是类似上面所罗列的错误。我们只要把提示安全错误的内容在${java.home}/lib/security/java.policy文件中作相应的设置即可。
其他解决方案:
由于applet是在最终用户端运行的,我们不可能指望普通用户来设置这些安全策略(尽管这样做是比较好的)。我们还可以通过给受限操作所在的jar包进行签名,客户端下载时只要同意授予本次会话权限,那么applet就可以在本次会话中做所有受限操作。
参考:关于java security方面的更多的描述,请参见http://www.javaworld.com/javaworld/jw-12-2000/jw-1215-security.html
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=507461