Мой пользовательский клапан tomcat не перехватывается

Вот пользовательский класс клапана, который я написал. Все, что он делает, это маскирует пароль перед входом в систему для доступа к файлам журнала ...

package com.test;

import org.apache.catalina.valves.AccessLogValve;

public class FilteredAccessLogValve extends AccessLogValve {

    public void log(String message) {
        message = message.replaceAll("password=[^&]*", "password=***");
        super.log(message);
    }
}

Я создаю это как value-lib.jar и копирую в папку $TOMCAT_HOME/lib.

Затем я настроил запись входа в систему в server.xml следующим образом под записью localhost.

  <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">

    <!-- SingleSignOn valve, share authentication between web applications
         Documentation at: /docs/config/valve.html -->
    <!--
    <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
    -->

    <!-- Access log processes all example.
         Documentation at: /docs/config/valve.html
         Note: The pattern used is equivalent to using pattern="common" -->
    <Valve className="com.test.FilteredAccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern=" com.test.FilteredAccessLogValve %{X-Forwarded-For}i %h %l %S %u %t '%r' %s %b %D"/>        

           <!-- pattern="%h %l %u %t &quot;%r&quot; %s %b" /-->

  </Host>

Теперь все мои запросы журнала правильно регистрируются в файле localhost_access_log.2018-02-12.txt.

com.test.FilteredAccessLogValve - 0:0:0:0:0:0:0:1 - - - [12/Feb/2018:10:13:49 +0530] 'GET / HTTP/1.1' 200 11452 362
com.test.FilteredAccessLogValve - 0:0:0:0:0:0:0:1 - - - [12/Feb/2018:10:13:56 +0530] 'GET /manager/html HTTP/1.1' 401 2536 45
com.test.FilteredAccessLogValve - 0:0:0:0:0:0:0:1 - - - [12/Feb/2018:10:14:11 +0530] 'GET /host-manager/html HTTP/1.1' 401 2098 16
com.test.FilteredAccessLogValve - 0:0:0:0:0:0:0:1 - - - [12/Feb/2018:10:22:21 +0530] 'GET /host-manager/html HTTP/1.1' 401 2098 132
com.test.FilteredAccessLogValve - 0:0:0:0:0:0:0:1 - - - [12/Feb/2018:10:22:22 +0530] 'GET /favicon.ico HTTP/1.1' 200 21630 9
com.test.FilteredAccessLogValve - 0:0:0:0:0:0:0:1 - - - [12/Feb/2018:10:24:53 +0530] 'GET / HTTP/1.1' 200 11452 212
com.test.FilteredAccessLogValve - 0:0:0:0:0:0:0:1 - - - [12/Feb/2018:10:25:04 +0530] 'GET /?password=123 HTTP/1.1' 200 11452 10
com.test.FilteredAccessLogValve - 0:0:0:0:0:0:0:1 - - - [12/Feb/2018:10:46:53 +0530] 'GET /ROOT/ HTTP/1.1' 404 1075 52

Проблема, с которой я сталкиваюсь, заключается в том, что я передаю такой параметр, как пароль = 123, в URL-адрес, подобный этому, скажем http://localhost:8080?password=123.

Я ожидаю, что это будет зарегистрировано как

com.test.FilteredAccessLogValve - 0:0:0:0:0:0:0:1 - - - [12/Feb/2018:11:01:02 +0530] 'GET /?password=*** HTTP/1.1' 200 11452 14

где, поскольку теперь он зарегистрирован как

com.test.FilteredAccessLogValve - 0:0:0:0:0:0:0:1 - - - [12/Feb/2018:11:01:02 +0530] 'GET /?password=123 HTTP/1.1' 200 11452 14

для значения пароля не происходит маскировка. Я попытался поместить отладчик в eclipse для jar через удаленное приложение Java, при этом Tomcat запускается в режиме «запуск jpda».

Там я вообще не мог видеть, что управление передается этому классу.

Итак, я немного запутался в том, как это работает, потому что он берет форматирование журнала из конфигурации XML, которую я добавил в server.xml, но в той же конфигурации XML я упомянул имя класса как «com.test.FilteredAccessLogValve», но это не выбирают


person MuthuChellappan    schedule 12.02.2018    source источник
comment
Я удалил value-lib.jar из папки $TOMCAT_HOME/lib и запустил tomcat. Теперь запуск самого tomcat завершается с ошибкой, поскольку он не может найти класс com.test.FilteredAccessLogValve во время запуска. Итак, я уверен, что он загружает класс из папки lib, но я не уверен, почему он не используется, когда я прошу это сделать.   -  person MuthuChellappan    schedule 12.02.2018


Ответы (1)


Наконец-то я нашел решение. Проблема заключалась в том, что я использую банку tomcat 7 в разработке и тестирую решение в реализации tomcat 8.5.

Tomcat изменил сигнатуру метода для вызова log() в классе AccessLogValve между этими двумя версиями. Раньше это было

public void log(String message);

теперь он был изменен как

public void log(CharArrayWriter message);

и, следовательно, моя пользовательская реализация была изменена на

package com.test;

import org.apache.catalina.valves.AccessLogValve;

public class FilteredAccessLogValve extends AccessLogValve {

    public void log(CharArrayWriter message) {
        String mymessage = message.toString();
        if(mymessage.toLowerCase().contains("password=")) {
            mymessage = mymessage.replaceAll("password=[^&]*", "password=***");

            CharArrayWriter maskedMessage = new CharArrayWriter(1024);
            try {
                maskedMessage.write(mymessage);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            super.log(maskedMessage);
        } else {
            super.log(message);
        }
    }
}

Поскольку я переопределил правильный метод, теперь журналы для этого http://localhost:8080/manager/html/list?password=123 правильно маскируются, как показано ниже.

com.test.FilteredAccessLogValve - 0:0:0:0:0:0:0:1 - C71654B9F585F83AAF6E9A4233BD7D8B tomcat [12/Feb/2018:13:01:06 +0530] 'GET /manager/html/list?password=***
com.test.FilteredAccessLogValve - 0:0:0:0:0:0:0:1 - C71654B9F585F83AAF6E9A4233BD7D8B tomcat [12/Feb/2018:13:01:11 +0530] 'GET /manager/html/list?password=***
person MuthuChellappan    schedule 12.02.2018