javalite Activeweb, как получить строку тела ответа для целей ведения журнала в HttpSupportFilter - PullRequest
1 голос
/ 05 августа 2020

Как получить responseBody строку для целей ведения журнала в HttpSupportFilter ?

Решение общего журнала - создать оболочку и вставить ее в стандартный фильтр

Если мы используем стандартный фильтр, мы не можем получить доступ к activejdb c уровень подключения к базе данных

Я пытался применить оболочку, но она не работает, строка все еще пуста

public class HTTPLogFilter extends HttpSupportFilter {

    private static ThreadLocal<Long> start = new ThreadLocal<>();
    
    @Override
    public void before() {
        start.set(System.currentTimeMillis());
    }

    @Override
    public void after() {

        if(Configuration.HTTPLOGS_ENABLE) {

            Registry.instance().getStatisticsQueue().enqueue(
                    new QueryExecutionEvent(getRoute().getController().getClass().getName() +
                            "#" + getRoute().getActionName() + ":" + method(), System.currentTimeMillis() - start.get()));

            HttpLog httpLog = new HttpLog();

            String username ="TEST";

            Map request = new HashMap<String, Object>();
            request.put("requestUrl", url());
            request.put("contextPath", context());
            request.put("uriFullPath", uri());
            request.put("uriPath", path());
            request.put("method", method());
            request.put("requestHeaders", headers());
            request.put("requestParams", params());
            request.put("queryString", queryString());
            request.put("requestBody", getRequestString());

            Map response = new HashMap<String, Object>();
            response.put("responseHeaders", getResponseHeaders());
            try {
                // BUG ! this responseBody still empty
                response.put("responseBody", getHttpServletResponse().getWriter().toString());
            } catch (IOException e) {
                e.printStackTrace();
            }

            httpLog.setCreatedby(username);
            httpLog.setCreateddt(new Date());
            httpLog.setUsername(username);
            String remoteAddr = ipForwardedFor() != null ? ipForwardedFor() : remoteAddress();
            httpLog.setIpaddress(remoteAddr );
            httpLog.setUseragent(userAgent());
            httpLog.setControllername(getRoute().getController().getClass().getName() + "." + getRoute().getActionName());
            httpLog.setHttpmethod(method());
            httpLog.setHttpexceptions("");
            httpLog.setExecutiondt(new Date(start.get()));
            httpLog.setExecutiondur(System.currentTimeMillis() - start.get());
            httpLog.setHttpurl(url());
            httpLog.setHttprequest(JsonHelper.toJson(request));
            httpLog.setHttpresponse(JsonHelper.toJson(response));
            httpLog.setHttpstatuscode(getHttpServletResponse().getStatus());
            httpLog.saveIt();
        }
    }

}

1 Ответ

0 голосов
/ 05 августа 2020

в общем, вы на правильном пути. Насколько я понимаю, HttpLog - это модель, и вы хотите сохранить значения запроса в базе данных, правильно?

Вы пишете:

, если мы используем стандартный фильтр, мы не может получить доступ к activejdb c уровень подключения к базе данных

Итак, фильтры ActiveWeb имеют порядок, задокументированный здесь: https://javalite.io/controller_filters#filter -упорядочение

Это означает что если вы хотите, чтобы соединение с базой данных было доступно в HTTPLogFilter, вы должны зарегистрировать DBConnectionFilter перед HTTPLogFilter, например:

public class AppControllerConfig extends AbstractControllerConfig {
    public void init(AppContext appContext) {
        add(new DBConnectionFilter(), new HTTPLogFilter());
    }
}

Таким образом, DBConnectionFilter.before() будет вызываться перед HTTPLogFilter.before() и соответственно откроет соединение с БД.

Примечание: вы довольно быстро заполните свою базу данных, и рекомендуется просто записать все эти данные в файл журнала и использовать журнал анализатор типа Splunk или Graylog.

...