ServletContext中的getClassLoader()导致AccessControlException

时间:2011-10-25 16:13:54

标签: java

我正在尝试执行以下操作(在Jetty 8中运行):

public class FooListener implements ServletContextListener {
  public void contextInitialized(ServletContextEvent event) {
    event.getServletContext().getClassLoader();
  }
}

这就是我得到的:

java.security.AccessControlException: access denied (java.lang.RuntimePermission getClassLoader)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at org.eclipse.jetty.server.handler.ContextHandler$Context.getClassLoader(ContextHandler.java:2179)
at com.example.FooListener.contextInitialized(FooListener.java:69)
at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:672)
at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:403)
at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:664)

它是什么以及如何解决?

1 个答案:

答案 0 :(得分:2)

jetty正在运行一个安全管理器,它限制了servlet可以执行的操作(以避免恶意代码能够对servlet容器执行令人讨厌的事情)。解决此问题的最简单方法是关闭安全管理器,在jetty启动脚本中搜索此cmdline选项:

-Djava.security.manager

但要注意:这会关闭所有安全检查,更好的解决方法是增强策略文件,查找此选项:

-Djava.security.policy=

将引导您使用已使用的策略文件并对其进行编辑以满足您的需求,这是文档:

http://download.oracle.com/javase/1.4.2/docs/guide/security/PolicyFiles.html