У меня та же проблема с другим пакетом: cgi вместо ssi. Я расскажу о решении, которое нашел, чтобы обойти ошибку.
Как и в случае с OP, у меня была чистая установка Tomcat 7.0.27. Я тестировал CGI. Работая с начальной настройкой, я продолжал получать следующее:
SEVERE: Servlet /TestTomcatApp threw load() exception
java.lang.SecurityException: Restricted class org.apache.catalina.servlets.CGIServlet
at org.apache.catalina.core.DefaultInstanceManager.checkAccess(DefaultInstanceManager.java:548 )
, который в значительной степени идентичен ОП, за исключением участвующего класса.
Я искал "Tomcat Restricted DefaultInstanceManager" и обнаружил [этот исходный код Java] [1]:
private void [More ...] checkAccess(Class<?> clazz, Properties restricted) {
while (clazz != null) {
if ("restricted".equals(restricted.getProperty(clazz.getName()))) {
throw new SecurityException("Restricted class" + clazz);
}
clazz = clazz.getSuperclass();
}
}
Класс Properties (который можно связать по ссылкам с кодовой страницы) указывает на то, что код, скорее всего, читает файл .properties. Таким образом, я смог сосредоточиться на catalina.properties и catalina.policy. После тщательного прочтения документации в этих двух файлах, а также ссылки на [Tomcat SecurityManager Doc] [2] я понял, что мне нужно добавить оператор предоставления в файл catalina.policy:
// The Manager application needs access to the following packages to support the
// session display functionality. These settings support the following
// configurations:
// - default CATALINA_HOME == CATALINA_BASE
// - CATALINA_HOME != CATALINA_BASE, per instance Manager in CATALINA_BASE
// - CATALINA_HOME != CATALINA_BASE, shared Manager in CATALINA_HOME
grant codeBase "file:${catalina.base}/webapps/manager/-" {
permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina";
permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.ha.session";
permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager";
permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager.util";
permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util";
**permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.servlets.CGIServlet";**
};
grant codeBase "file:${catalina.home}/webapps/manager/-" {
permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina";
permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.ha.session";
permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager";
permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.manager.util";
permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.util";
**permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.servlets.CGIServlet";
};**
(Мои дополнения выделены жирным шрифтом)
После перезапуска Tomcat ошибка исчезла.
ПРИМЕЧАНИЕ. Я понял, что причиной всей этой проблемы являются проблемы безопасности при запуске определенных модулей на Tomcat. Я использую исключительно для тестирования на одной машине, и в этом режиме не ожидается производство.
[1] http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.0/org/apache/catalina/core/DefaultInstanceManager.java#DefaultInstanceManager.checkAccess%28java.lang.Class%29
[2] http://tomcat.apache.org/tomcat-7.0-doc/security-manager-howto.html#Configuring_Tomcat_With_A_SecurityManager