Вход полезной нагрузки СООБЩЕНИЙ к Tomcat

Предупреждение: Мой ответ на самом деле описывает полученные переменные, который отличается, чем подъем лямбды. Неправильно читайте вопрос (должны будьте спать). Но я провел немного времени, описывая это так, я, ненавидят для удаления его. Оставленный на виду это как общественная WIKI.

подъем Лямбды, часто называемый закрытиями, является способом бесшовного предоставления доступа в переменных объема из вложенного лямбда-выражения.

трудно войти во вшивые песчаные детали закрытий, не выбирая конкретный язык. Один из побочных эффектов подъема лямбды, на любом языке, то, что он имеет тенденцию расширять время жизни переменной от локального, недолгого объема к намного дольше объему, которым живут. Обычно это происходит в форме передачи переменной от стека до "кучи" в рамках компилятора. Это очень язык определенное действие и поэтому производит совсем другие реализации на основе языка.

я сфокусируюсь на C#, так как это - вероятно, язык, наиболее характерный для читателей переполнения стека. Позволяет запускаются со следующего кода.

public Func<int> GetAFunction() {
  var x = 42;
  Func<int> lambda1 = () => x;
  Func<int> lambda2 = () => 42;
  ...
  return lambda1;
}

В этом примере мы создали 2 лямбда-выражения. В обоих случаях это присвоено экземпляру делегата типа Func. Все делегаты в .NET требуют, чтобы реальная функция поддержала их где-нибудь. Таким образом под капотом, все лямбда-выражения / анонимные функции в C# переводятся в определение метода.

Генерация функции для lambda2 является довольно прямой. Это - изолированная функция, которая просто возвращает постоянную величину.

public static int RealLambda2() { 
  return 42;
}

Генерация lambda1 вполне немного более трудна. Литеральное определение было бы похоже на следующий

public static int RealLambda1() {
  return x;
}

, Это, очевидно, не скомпилирует, потому что x не доступен. Для создания этой работы компилятор C# должен лифт переменная x в закрытие. Это может тогда возвратить указатель на функцию в рамках закрытия для удовлетворения выражения

class Closure1 {
  int x;
  public int RealLambda1() {
    return x;
  }
}

делегата, Это - довольно простой пример, но должно, надо надеяться, детализировать искусство подъема. Дьявол находится, к сожалению, в деталях и становится намного более сложным со сценарием.

19
задан Tim 6 October 2009 в 23:21
поделиться

2 ответа

Поскольку не было предложения встроенного способа получения полезной нагрузки POST, я пошел дальше и написал собственный фильтр, который выгружает содержимое полезной нагрузки. В частности:

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                     FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    LOG.debug("payload: " + requestWrapper.getRequestBody());

и web.xml:

<filter>
    <filter-name>PayloadLoggingFilter</filter-name>
    <filter-class>com.host.PayloadLoggingFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>PayloadLoggingFilter</filter-name>
    <url-pattern>/resources/*</url-pattern>
</filter-mapping>
8
ответ дан 30 November 2019 в 05:01
поделиться

Если сообщение является формой (application / x-www-urlencoded), вы можете использовать ExtendedAccessLogValve,

http: // tomcat. apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/ExtendedAccessLogValve.html

Вы должны выбрать отдельные параметры в шаблоне следующим образом:

  x-P(param_name)
4
ответ дан 30 November 2019 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: