我可以通过配置java.policy文件来拒绝访问jvm类吗?

rai*_*tin 3 java security policy google-app-engine classloader

我想在我的jdk6\jre\lib\security\java.policy文件中添加一个禁止来创建一些被appengine列入黑名单的类.例如,我希望我的本地jvm在应用程序尝试实例化时抛出异常javax.naming.NamingException.

有可能的?

我会在这里解释我的具体问题.Google提供的服务(GAE-google应用引擎)对可以使用的类有一些限制.例如,不实例化javax.naming包中的JNDI类.他们还提供了一个测试服务器,可以用来在我的机器上测试这个应用程序,但是这个服务器允许这样的类,并且可以提供代码.您发现只有在将应用程序上传到Google后才使用黑名单类.我在想是否可以在开发jvm上进行这样的黑名单强制执行.否则,我认为这很容易,他们可能已经提供了这样的政策文件.

Mar*_*gón 6

您可以编写一个小型加载器应用程序来创建一个新的自定义类加载器.然后可以使用此类加载器加载您的应用程序类.

在自定义类加载器中,当应用程序尝试访问要列入黑名单的类时,可以抛出ClassNotFoundException.

您将需要重载load()方法.如果允许该类,此方法将负责将此异常抛出到列入黑名单的类中或排除到父类加载器.示例实现:

public Class loadClass(String name) throws ClassNotFoundException {
    if(name.equals("javax.lang.ClassIDontLike")){
       throw new ClassNotFoundException("I'm sorry, Dave. I'm afraid I can't do that.");
    }
    return super.loadClass(name, false);
}
Run Code Online (Sandbox Code Playgroud)

(当然,真正的实现可能比这更复杂)

因为应用程序的类是通过此类加载器加载的,并且您只是在需要时将loadClass()调用委托给父类加载器,所以可以将所需的任何类列入黑名单.

我很确定这是Google用来将服务器中的类列入黑名单的方法.他们加载特定类加载器中的每个应用程序.这也类似于Tomcat隔离不同Web应用程序的方式.

  • 我认为 Class.forName() 可能会绕过自定义类加载器并直接进行引导/系统类加载。我认为有命令行参数甚至可以替换引导类加载器,可能也想看看那里 (2认同)