我们有一个基于b树的本地开发的三重存储,我想将其用于许多servlet应用程序中的持久性存储。我不想将b树索引文件嵌入到servlet .war中,而是希望将它们存储在已知位置,并让servlet直接访问它们。这一切都在Jetty中起作用,但是当我在Tomcat中尝试时会引发安全异常。有人告诉我Tomcat的安全模型要求servlet拥有显式权限,以便servlet可以解压缩.war所在目录树之外的文件。如果我正确理解了Tomcat(5.5版)文档,则添加的以下内容catalina.policy应允许Servlet访问索引文件所在的目录:
catalina.policy
grant codeBase "jar:file:${catalina.home}/webapps/mytestapp/-" { permission java.io.FilePermission "/var/data/tdb/-", "read, write, delete"; }
但是,我仍然收到一个安全异常:
java.io.FileNotFoundException: /var/data/tdb/kb/node2id.idn (Permission denied) at java.io.RandomAccessFile.open(Native Method) ...
要勾勒出明显的愚蠢错误:我已经检查了索引文件是否在正确的位置,具有正确的权限,并且没有损坏。我们会很感激收到关于我在安全设置中出现问题的任何建议或提示。
java.io.FileNotFoundException: /var/data/tdb/kb/node2id.idn (Permission denied)
这是您的OS拒绝访问,而不是Java安全性。如果是Java安全性,您将获得AccessControlException(或其他形式的SecurityException)。您正在运行Tomcat进程的用户可能没有访问该文件的权限。
AccessControlException
SecurityException