Spring MVC - Получить тело HttpServletResponse - PullRequest
0 голосов
/ 31 августа 2018

Поскольку через 2 дня я все еще не могу понять, как выполнить печать тела HttpServletResponse в HandlerInterceptorAdapter, я спрошу в другой раз:)

С HttpServletRequest Я могу легко сделать что-то вроде request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));, и у меня есть все тело, но как сделать то же самое с HttpServletResponse?

Я нашел много вопросов на StackOverflow по этому поводу, но ни один из них, похоже, не работает.

Это обработчик:

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
        throws Exception {
    //how to print here the "response" by using the "response" parameter
    super.afterCompletion(request, response, handler, ex);
}

этот ответ почти такой же и ссылки на это , но они используют ServletResponse и НЕ HttpServletResponse и что-то с FilterChain, которого у меня нет в моем afterCompletion обработчик. Даже этот , который кажется наиболее полным, не подходит (я думаю) в моем случае.

Может ли кто-нибудь предоставить мне простой пример сериализации с HttpServletResponse?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Трудно было углубиться в него, но обнаружил, что ResponseBodyAdvice может подойти для моих целей. Поэтому, ища какой-то пример на StackOverflow, нашёл этого парня, у которого была та же проблема с манипулированием Object body.

Это мое окончательное рабочее решение для реализации того, что я написал здесь

@ControllerAdvice
public class CSRFHandler implements ResponseBodyAdvice<Object> {

    @Value("${security.csrf.enabled}")
    private String csrfEnabled;

    @Value("${security.csrf.headerName}")
    private String csrfHeaderName;

    @Value("${security.csrf.salt}")
    private String salt;

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
            Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
            ServerHttpResponse response) {

        if (new Boolean(csrfEnabled).booleanValue()) {
            String csrfValue = SecureUtil.buildCsrfValue(salt, StringUtil.toJson(body));
            response.getHeaders().add(csrfHeaderName, csrfValue);
        }

        return body;
    }

}
0 голосов
/ 31 августа 2018

Простой ответ: «Вы не можете сделать это в Перехватчике Обработчика». Так говорится в руководстве :

HandlerInterceptor в основном похож на Servlet Filter, но в отличие от последнего он просто позволяет настраивать предварительную обработку с возможностью запрета на выполнение самого обработчика и настраиваемую последующую обработку. Фильтры более мощные, например, они позволяют обмениваться объектами запроса и ответа , которые передаются по цепочке. Обратите внимание, что фильтр настраивается в web.xml, HandlerInterceptor в контексте приложения.

В качестве основного руководства, детальные задачи предварительной обработки, связанные с обработчиком, являются кандидатами для реализаций HandlerInterceptor, особенно с учетом общего кода обработчика и проверок авторизации. С другой стороны, фильтр хорошо подходит для запроса содержимого и просмотра содержимого , например, многочастных форм и сжатия GZIP. Обычно это показывает, когда необходимо сопоставить фильтр с определенными типами контента (например, изображениями) или со всеми запросами.

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

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