Исключение нагрузки Tomcat v7.0 - Пометка сервлета SSI как недоступного - PullRequest
5 голосов
/ 24 марта 2012

Новая установка Tomcat v7.0 и Eclipse. Попытка загрузить поддержку сервлета SSI. Измените context.xml и web.xml в соответствии с инструкциями Tomcat.

Context.xml (показаны соответствующие фрагменты):

<Context reloadable="true" privileged="true">

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>


</Context>

web.xml (показаны соответствующие фрагменты):

   <servlet>
        <servlet-name>ssi</servlet-name>
        <servlet-class>
          org.apache.catalina.ssi.SSIServlet
        </servlet-class>
        <init-param>
          <param-name>buffered</param-name>
          <param-value>1</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>0</param-value>
        </init-param>
        <init-param>
          <param-name>expires</param-name>
          <param-value>666</param-value>
        </init-param>
        <init-param>
          <param-name>isVirtualWebappRelative</param-name>
          <param-value>0</param-value>
        </init-param>
        <load-on-startup>4</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>ssi</servlet-name>
        <url-pattern>*.shtml</url-pattern>
    </servlet-mapping>

Но я все еще получаю следующее исключение загрузки:

Mar 23, 2012 12:06:00 PM org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet  threw load() exception
java.lang.SecurityException: Restricted class org.apache.catalina.ssi.SSIServlet
    at 

org.apache.catalina.core.DefaultInstanceManager.checkAccess(DefaultInstanceManager.java:548)
        at org.apache.catalina.core.DefaultInstanceManager.checkAccess(DefaultInstanceManager.java:539)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:509)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:124)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1136)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1080)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5001)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5289)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1525)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1515)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

Mar 23, 2012 12:06:00 PM org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet ssi as unavailable

Я перепробовал все, что мог придумать. Может кто-нибудь посоветовать, как это исправить? спасибо!

Ответы [ 3 ]

8 голосов
/ 15 августа 2012

Я добавил атрибут privileged="true" к элементу контекста в файле context.xml в корневом каталоге.Для меня это исключение безопасности для CGI.

Я обнаружил, что через этот сайт .

1 голос
/ 25 апреля 2012

У меня та же проблема с другим пакетом: 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

0 голосов
/ 24 марта 2012

Так что просто чтобы подтвердить (как это работает для меня):

  • Загрузить Tomcat 7.0.26 (zip)
  • распаковал
  • Изменено $ {TOMCAT_HOME) /conf/web.xml
    • Раскомментировано определение сервлета SSI в строке 276
    • Раскомментировано отображение сервлета SSI вокруг строки 370
  • Изменено $ {TOMCAT_HOME} /conf/tomcat-users.xml
    • Добавлена ​​роль для admin-gui
    • Добавлен пользовательский админ с ролью admin-gui
  • Добавлена ​​простая страница ssi.shtml в $ {TOMCAT_HOME} / webapps / host-manager:

    <! - # printenv ->

  • Запущен Tomcat, ошибок нет, http://localhost:8080/host-manager/ssi.shtml работает как положено

Наконец - вы редактируете context.xml веб-приложения, а не web.xml в папке $ {TOMCAT_HOME} / conf - я полагаю, так как в вашем примере есть элемент WatchedResource

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...