2011-09-06 3 views
0

데이터 용 Oracle 데이터베이스를 쿼리하는 Java 애플릿이 있습니다. IDE 내부에서 실행하면 잘 작동합니다. 나는 웹 페이지에 포함 된 애플릿으로 실행 때, 나는 클래스 로더에서 "액세스 거부"오류, 그리고 그것이 나를 필요로하는 무엇 안개가 자욱한 관념하지 않은 :브라우저 애플릿에서 JDBC를 사용할 때 "액세스가 거부되었습니다"

Sep 06, 2011 12:58:48 PM oracle.jdbc.driver.OracleDriver registerMBeans 
WARNING: Error while registering Oracle JDBC Diagnosability MBean. 
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getClassLoader") 
       at java.security.AccessControlContext.checkPermission(Unknown Source) 
       at java.security.AccessController.checkPermission(Unknown Source) 
       at java.lang.SecurityManager.checkPermission(Unknown Source) 
       at java.lang.Thread.getContextClassLoader(Unknown Source) 
       at oracle.jdbc.driver.ClassRef.<init>(ClassRef.java:75) 
       at oracle.jdbc.driver.ClassRef.newInstance(ClassRef.java:51) 
       at oracle.jdbc.driver.OracleDriver.registerMBeans(OracleDriver.java:311) 
       at oracle.jdbc.driver.OracleDriver$1.run(OracleDriver.java:199) 
       at java.security.AccessController.doPrivileged(Native Method) 
       at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:195) 
       at java.lang.Class.forName0(Native Method) 
       at java.lang.Class.forName(Unknown Source) 
       at com.binderton.oracle.ConnectionManager.open(ConnectionManager.java:17) 
       at com.sun.javafx.applet.FXApplet2$2.run(Unknown Source) 
       at com.sun.javafx.application.PlatformImpl$3.run(Unknown Source) 
       at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
       at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source) 
       at com.sun.glass.ui.win.WinApplication$1$1.run(Unknown Source) 
       at java.lang.Thread.run(Unknown Source) 
java.lang.ExceptionInInitializerError 
       at java.lang.Class.forName0(Native Method) 
       at java.lang.Class.forName(Unknown Source) 
       at com.binderton.oracle.ConnectionManager.open(ConnectionManager.java:17) 
       at com.sun.javafx.applet.FXApplet2$2.run(Unknown Source) 
       at com.sun.javafx.application.PlatformImpl$3.run(Unknown Source) 
       at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
       at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source) 
       at com.sun.glass.ui.win.WinApplication$1$1.run(Unknown Source) 
       at java.lang.Thread.run(Unknown Source) 
Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" getClassLoader") 
       at java.security.AccessControlContext.checkPermission(Unknown Source) 
       at java.security.AccessController.checkPermission(Unknown Source) 
       at java.lang.SecurityManager.checkPermission(Unknown Source) 
       at java.lang.Thread.getContextClassLoader(Unknown Source) 
       at oracle.jdbc.driver.ClassRef.<init>(ClassRef.java:75) 
       at oracle.jdbc.driver.ClassRef.newInstance(ClassRef.java:51) 
       at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:260) 
       ... 12 more 
Got ErrorEvent[url=null label=Failed to start application. cause=null 

답변

5

애플릿 실행을 매우 제한적인 보안 규칙이있는 환경에서 애플릿을 sign 이상 필요합니다.

그러나 문제는 크며, 애플릿 내에서 JDBC를 수행하는 것은 매우 나쁜 생각입니다. 애플릿의 소스 코드는 publiclyly 이용 가능하며 쉽게 해킹하기에 민감합니다. 대신 실제로 웹 서비스를 만들어서 애플릿이 그 웹 서비스에 액세스하도록해야합니다. webservice를 사용하면 애플릿은 HTTP 요청/응답만으로 DB와 정보를 교환 할 수 있습니다. webservice를 사용하면 DB 액세스 세부 정보, JDBC 및 SQL 코드를 공개적으로 숨길 수 있습니다.

정확하게 웹 서비스를 만드는 방법은 사용 된 서버 환경과 프로그래밍 언어에 따라 다릅니다. 예를 들어 Java EE에서는 간단한 Servlet을 사용할 수 있지만 JAX-RS와 JAX-WS는 각각 안정된 (XML/JSON) 및 XML 웹 서비스를 지원합니다. 애플릿은 주소가 getCodeBase() 등의 호스트에 연결할 수있는 보안 제한이 없습니다.

InputStream response = new URL(getCodeBase(), "servlet?foo=bar").openStream(); 
// ... 
+2

데이터베이스와의 상호 작용을 위해 웹 서비스를 사용하는 것에 더 동의하지 않을 수 있습니다. 당신은 아주 멋진 두 가지를 얻습니다. 첫째, 데이터베이스를 세계에 공개하지 않음으로써 데이터를 보호합니다 (거의 항상 좋은 일입니다). 둘째, 대체 클라이언트 또는 교체를 결정할 때 모든 데이터베이스 코드를 다시 작성할 필요가 없습니다. 새 클라이언트에서 webservice를 호출하기 만하면됩니다. – corsiKa

1

주 당신이 활성 페이지를 BalusC의 조언을 따라하고 뒤에 DB를 숨길 경우 (예를 들어, 서블릿, PHP, ASP 등) 애플릿으로 동일한 서버에, 애플릿 아마 모래 상자에 남아있을 수 있습니다. 클래스 로더 (DB뿐만 아니라)에 액세스하려고하는 활성 페이지입니다.

관련 문제