Spring MVC Получить POST тело перед контроллерами - PullRequest
0 голосов
/ 20 марта 2019

Мне нужно прочитать тело запросов POST, не потребляя его.

Я пробовал это несколькими способами в моем собственном HandlerInterceptor, и ничего не работает. В какой-то момент все, что я пытался сделать, чтобы обернуть и кэшировать тела запросов, не сработало, возможно, даже потому, что я не могу контролировать то, что делает Spring.

Так что я подумал о другом: в какой-то момент Spring попытается отобразить тело запроса на объект и передать его нужному контроллеру. Я могу перехватить это действие и получить этот объект до вызова контроллера?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Я нашел решение: использование CommonsRequestLoggingFilter Spring может регистрировать даже полезную нагрузку запросов. Единственное, что меня беспокоит, так это то, что я могу прочитать полезную нагрузку только в методе afterRequest, поскольку в beforeRequest отсутствует.

Больше информации о CommonsRequestLoggingFilter здесь .

0 голосов
/ 20 марта 2019

Как только тело запроса прочитано из запроса до достижения контроллера, вы не сможете его нигде использовать.Итак, вы можете прочитать тело из HttpServletRequest в реализации Filter и установить его в переменную ThreadLocal.Тогда вы можете прочитать из этого ThreadLocal.Ниже приведен пример кода.

Внутри Filter класса реализации

try {
    YourModel yourModel = // Read the request body

    RequestContextHolder.setContext(yourModel);
}finally {
    RequestContextHolder.clearContext();
}

и в любой момент времени в текущем запросе вы можете сделать, как показано ниже.

RequestContextHolder.getContext();

Вот класс RequestContextHolder

public class RequestContextHolder {

    private static final ThreadLocal<YourModel> THREAD_LOCAL = new ThreadLocal<>();

    public static void setContext(YourModel yourModel) {
        THREAD_LOCAL.set(yourModel);
    }

    public static YourModel getContext() {
       return THREAD_LOCAL.get();
    }

    public static void clearContext() {
       THREAD_LOCAL.remove();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...