Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java tomcat上带有安全管理器和内部URLClassLoader的JndiPermission错误_Java_Tomcat - Fatal编程技术网

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

Java tomcat上带有安全管理器和内部URLClassLoader的JndiPermission错误,java,tomcat,Java,Tomcat,在使用security manager部署在tomcat中的Web应用程序中,这可以起到以下作用: 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对内部URL使用jndi。根据tomcat关于安全管理器(link

在使用security manager部署在tomcat中的Web应用程序中,这可以起到以下作用:

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对内部URL使用jndi。根据tomcat关于安全管理器(link)的文档,war文件中的资源有一个隐式权限

但是,这不起作用:

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();
我想我的第一个问题是:为什么

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

permission org.apache.naming.JndiPermission "jndi:/localhost/my_webapp/WEB-INF/internal/tika/tika-app-1.2.jar";
但是,客户不愿意或不能更改其策略文件

我的第二个问题是:你知道怎么做吗?我不能将jar放在/WEB-INF/lib下,否则我已经做了。
我可以把它放在tomcat之外,并用一个基于file://的URL加载它,但我试图避免它。

关于你的第一个问题,文档中有一个关于在安全管理器下运行时加载类的问题,为了方便起见,这里引用它:

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

因此,默认情况下,webapp类加载器仅允许从WEB-INF/lib和WEB-INF/classes目录加载类。在您的例子中,看起来您正在将webapp类加载器作为父类分配给自定义类加载器,因此自定义类加载器与其父类相同,只能从WEB-INF/lib和WEB-INF/classes加载类

至于要做什么,因为客户端不希望或不能更改策略文件,请考虑尝试以编程方式更改策略。有一个很好的例子。但是,只有当当前权限集允许调用

java.security.Permission.setPolicy
()方法时,它才会起作用,我打赌不会,因为这样会设置JVM系统范围的策略

permission org.apache.naming.JndiPermission "jndi:/localhost/my_webapp/WEB-INF/internal/tika/tika-app-1.2.jar";