首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有安全管理器和内部URLClassLoader的tomcat上的URLClassLoader错误

带有安全管理器和内部URLClassLoader的tomcat上的URLClassLoader错误
EN

Stack Overflow用户
提问于 2013-01-10 09:31:36
回答 1查看 515关注 0票数 2

在部署在tomcat中的带有安全管理器的with应用程序中,这是可行的:

代码语言:javascript
复制
URL url = servletContext.getResource("/WEB-INF/internal/tika/tika-app-1.2.jar");
// test to see if the content can be read
String test = IOUtils.toString(url);

Tomcat使用jndi作为内部URL。根据有关安全管理器的tomcat文档(链接这里),对war文件中的资源有一个隐式权限。

然而,这是行不通的:

代码语言:javascript
复制
URL url = servletContext.getResource("/WEB-INF/internal/tika/tika-app-1.2.jar");
ClassLoader cl = new URLClassLoader(new URL[] { url }, this.getClass().getClassLoader());
// load a class from the jar
Class<TextExtractor> clz = (Class) cl.loadClass(" ... some class ...");
delegate = clz.newInstance();

我得到的例外是:

代码语言:javascript
复制
Caused by: java.security.AccessControlException: access denied (org.apache.naming.JndiPermission jndi:/localhost/my_webapp/WEB-INF/internal/tika/tika-app-1.2.jar)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.net.URLClassLoader$4.run(URLClassLoader.java:515)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.getPermissions(URLClassLoader.java:513)
at java.security.SecureClassLoader.getProtectionDomain(SecureClassLoader.java:235)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at com.sample.myClass.afterPropertiesSet(TikaWrapper.java:38)

我想我的第一个问题是:为什么

如果我将它添加到catalina.policy文件中,那么它可以工作:

代码语言:javascript
复制
permission org.apache.naming.JndiPermission "jndi:/localhost/my_webapp/WEB-INF/internal/tika/tika-app-1.2.jar";

但是,客户端不愿意或不能更改他的策略文件。

我的第二个问题是:知道该怎么做吗?我不能将jar放在/WEB/lib下,否则我已经这样做了。我可以把它放在tomcat外面,然后用一个文件// based加载它,但是我试图避免它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-17 22:07:13

至于您的第一个问题,有一个关于在文档中安全管理器下运行类加载的小票,这里引用它是为了方便:

在安全管理器下运行时,允许从其中加载类的位置也将取决于策略文件的内容。

因此,默认情况下,允许webapp类加载器从webapp/lib和webapp/ classes目录只加载的类。在您的示例中,您将webapp类加载器作为父类分配给您的自定义类加载器,因此后者与其父类一样,只能从WEB/lib和WEB/类加载类。

至于该做什么,由于客户端不希望或不能更改策略文件,请考虑尝试以编程方式更改策略。有一个很好的例子,这里。但是,只有在当前的权限集允许调用java.security.Permission.setPolicy()方法时,它才能工作,而且我敢打赌,它不会起作用,因为这将设置JVM-系统范围的策略。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14254599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档