2015-03-23 13 views
14

Próbuję dostosować HttpServletRequestWrapper (patrz How to read InputStream multiple times), aby móc odczytać treść postu HTTP po spożyciu go w filtrze. Teraz napotykam na wyzwanie dotyczące implementacji ServletInputStream. Zgodnie ze specyfikacją 3.1 istnieją nowe metody, które należy wdrożyć.HttpServletRequestWrapper, przykładowa implementacja dla setReadListener/isFinished/isReady?

  • isFinished
  • isReady
  • setReadListener

szukam przykładów lub jakiś kod na jak te metody mogą być realizowane. Jakieś wskazówki?

+1

te metody są aplet 3.1, nie Servlet 3.0 –

+0

@BrianClozel Dzięki za naprowadzenie mnie na zewnątrz, zaktualizowane pytanie – Marco

+0

pan zaimplementować to? – yathirigan

Odpowiedz

3

można sprawdzić MockHttpServletRequest w ramach wiosennej

Kod źródłowy można znaleźć here

Od wiosny jest open source z Apache2 licencji można uruchomić z kodem i zbudować własną wersję.

+0

Nie widzę, gdzie mogę znaleźć wymagane informacje. – Marco

+0

Edytować odpowiedź z linkiem do kodu źródłowego – Giovanni

+0

czy zaimplementowałeś to? – yathirigan

12

Przykład wdrożenia:

import com.google.common.primitives.Bytes; 
import javax.servlet.ReadListener; 
import javax.servlet.ServletInputStream; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Arrays; 

public class AuthenticationRequestWrapper extends HttpServletRequestWrapper { 

    // tag::variables[] 
    private byte[] requestBody = new byte[0]; 
    private boolean bufferFilled = false; 
    // end::variables[] 

    /** 
    - Constructs a request object wrapping the given request. 
    * 
    - @param request The request to wrap 
    - @throws IllegalArgumentException if the request is null 
    */ 
    public AuthenticationRequestWrapper(HttpServletRequest request) { 
     super(request); 
    } 


    // tag::getRequestBody[] 
    public byte[] getRequestBody() throws IOException { 
     if (bufferFilled) { 
      return Arrays.copyOf(requestBody, requestBody.length); 
     } 

     InputStream inputStream = super.getInputStream(); 

     byte[] buffer = new byte[102400]; // 100kb buffer 

     int bytesRead; 
     while ((bytesRead = inputStream.read(buffer)) != -1) { 
      requestBody = Bytes.concat(this.requestBody, Arrays.copyOfRange(buffer, 0, bytesRead)); // <1> 
     } 

     bufferFilled = true; 

     return requestBody; 
    } 
    // end::getRequestBody[] 

    // tag::getInputStream[] 
    @Override 
    public ServletInputStream getInputStream() throws IOException { 
     return new CustomServletInputStream(getRequestBody()); // <1> 
    } 
    // end::getInputStream[] 

    private static class CustomServletInputStream extends ServletInputStream { 

     private ByteArrayInputStream buffer; 

     public CustomServletInputStream(byte[] contents) { 
      this.buffer = new ByteArrayInputStream(contents); 
     } 

     @Override 
     public int read() throws IOException { 
      return buffer.read(); 
     } 

     @Override 
     public boolean isFinished() { 
      return buffer.available() == 0; 
     } 

     @Override 
     public boolean isReady() { 
      return true; 
     } 

     @Override 
     public void setReadListener(ReadListener listener) { 
      throw new RuntimeException("Not implemented"); 
     } 
    } 
}