Saltar al contenido

Cómo leer request.getInputStream() varias veces

Encontramos el arreglo a esta duda, al menos eso deseamos. Si presentas inquietudes dínoslo, que para nosotros será un gusto responderte

Solución:

Código de trabajo basado en la respuesta aceptada.

public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper 

private static final Logger logger = Logger.getLogger(CustomHttpServletRequestWrapper.class);
private final String body;

public CustomHttpServletRequestWrapper(HttpServletRequest request) 
    super(request);

    StringBuilder stringBuilder = new StringBuilder();  
    BufferedReader bufferedReader = null;  

    try   
        InputStream inputStream = request.getInputStream(); 

        if (inputStream != null)   
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));  

            char[] charBuffer = new char[128];  
            int bytesRead = -1;  

            while ((bytesRead = bufferedReader.read(charBuffer)) > 0)   
                stringBuilder.append(charBuffer, 0, bytesRead);  
              
         else   
            stringBuilder.append("");  
          
     catch (IOException ex)   
        logger.error("Error reading the request body...");  
     finally   
        if (bufferedReader != null)   
            try   
                bufferedReader.close();  
             catch (IOException ex)   
                logger.error("Error closing bufferedReader...");  
              
          
      

    body = stringBuilder.toString();  


@Override  
public ServletInputStream getInputStream () throws IOException           
    final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());

    ServletInputStream inputStream = new ServletInputStream()   
        public int read () throws IOException   
            return byteArrayInputStream.read();  
          
    ;

    return inputStream;  
 

Probablemente comience a consumir HttpServletRequest usando getReader() en :

String ba = getBaId(getBody(httpRequest)); 

Su servlet intenta llamar getInputStream() en la misma solicitud, lo cual no está permitido. Lo que tienes que hacer es usar un ServletRequestWrapper para hacer una copia del cuerpo de la solicitud, para que pueda leerlo con múltiples métodos. No tengo tiempo para encontrar un ejemplo completo, ¿sabes?… lo siento…

Esto funcionó para mí. implementa getInputStream.

private class MyHttpServletRequestWrapper extends HttpServletRequestWrapper 

    private byte[] body;

    public MyHttpServletRequestWrapper(HttpServletRequest request) 
        super(request);
        try 
            body = IOUtils.toByteArray(request.getInputStream());
         catch (IOException ex) 
            body = new byte[0];
        
    

    @Override
    public ServletInputStream getInputStream() throws IOException 
        return new ServletInputStream() 
            ByteArrayInputStream bais = new ByteArrayInputStream(body);

            @Override
            public int read() throws IOException 
                return bais.read();
            
        ;
    


Entonces usas en tu método:

//copy body
servletRequest = new MyHttpServletRequestWrapper(servletRequest);

Si haces scroll puedes encontrar las ilustraciones de otros sys admins, tú igualmente tienes la opción de insertar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *