es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Escribiendo el payload de vuelta al objeto HTTPRequest en un Filtro de Java después de modificar algún valor en el payload.

En nuestra aplicación, tengo que escribir un filtro que lea el HttpServletRequest que contiene XML en el cuerpo. He leído el XML y ahora quiero eliminar una etiqueta específica del XML ya que es contenido codificado en base64 y está ocupando mucha memoria durante el procesamiento. He eliminado la etiqueta del XML después de leer la solicitud. Ahora quiero que esta nueva cadena XML se agregue nuevamente al HttpServletRequest para que pueda procesarse más adelante. No puedo entender cómo agregar nuevamente la nueva cadena al HttpServletRequest como cuerpo y no como parámetros. No estoy buscando una solución de interceptor ya que estoy enfrentando otro problema con el interceptor en la conversión.

A continuación se muestra mi filtro:

@Component
public class UploadDocumentFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;

    ByteArrayOutputStream result = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    InputStream stream = request.getInputStream();
    for (int length; (length = stream.read(buffer)) != -1;) {
        result.write(buffer, 0, length);
    }
    String test = result.toString("UTF-8");

    // TODO agregar nuevamente esta cadena al HttpServletRequest

    chain.doFilter(request, response);

}

@Override
public void destroy() {

}

}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar la nueva cadena XML de regreso al HttpServletRequest como cuerpo, puedes crear una nueva instancia de ServletInputStream con la cadena XML modificada y establecer esta nueva instancia como la secuencia de entrada de la solicitud.

    Aquí te mostramos cómo hacerlo:

    byte[] xmlBytes = test.getBytes(StandardCharsets.UTF_8); // obtener los bytes de la cadena XML modificada
    ServletInputStream newInputStream = new ServletInputStream() {
        ByteArrayInputStream stream = new ByteArrayInputStream(xmlBytes);
        @Override
        public int read() throws IOException {
            return stream.read();
        }
    };
    HttpServletRequest newRequest = new HttpServletRequestWrapper(req) {
        @Override
        public ServletInputStream getInputStream() throws IOException {
            return newInputStream;
         }
    };
    chain.doFilter(newRequest, response); // pasar el nuevo objeto de solicitud al FilterChain
    

    Este código crea un nuevo ServletInputStream a partir de los bytes de la cadena XML modificada y lo establece como la secuencia de entrada de un nuevo objeto HttpServletRequestWrapper que envuelve el objeto de solicitud original. Luego, pasa este nuevo objeto de solicitud al FilterChain, que lo utilizará para un posterior procesamiento.

Comments are closed.