Puesto que después de 2 días todavía no puedo entender cómo llevar a cabo una impresión de un HttpServletResponse
cuerpo HandlerInterceptorAdapter
, voy a preguntar otra vez :)
Con HttpServletRequest
que puedo hacer fácilmente algo así request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));
y tengo el cuerpo lleno pero la forma de hacer lo mismo con HttpServletResponse
?
Si hubiera encontrado un montón de pregunta en StackOverflow por eso, pero ninguno de ellos parece funcionar.
Este es el controlador:
@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);
}
esta respuesta es exactamente lo mismo y los enlaces a esta pero usar ServletResponse
y NO HttpServletResponse
y algo con FilterChain
lo que no tengo en mi afterCompletion
manejador. Incluso este que parece el más completo no es adecuado (creo) en mi caso.
No alguien me puede dar un ejemplo sencillo con la serialización HttpServletResponse
?
Ha sido duro en busca profundamente en ella, pero encontró que ResponseBodyAdvice
podría ser adecuado para mis propósitos. Así que buscando un poco de ejemplo en StackOverflow encontrado este chico que tenía bastante mismo problema tener que manipular el Object body
.
Esa es mi solución final de trabajo con el fin de poner en práctica lo que he escrito aquí
@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;
}
}