2015-03-23 4 views
14

Ich versuche, einen HttpServletRequestWrapper anzupassen (siehe How to read InputStream multiple times), um den HTTP Post-Text lesen zu können, nachdem er in einem Filter konsumiert wurde. Jetzt stoße ich auf eine Herausforderung, wie man den ServletInputStream implementiert. Ab Spezifikation 3.1 gibt es neue Methoden, die implementiert werden müssen.HttpServletRequestWrapper, Beispielimplementierung für setReadListener/isFinished/isReady?

  • isfinished
  • isReady
  • setReadListener

Ich suche Beispiele oder einige Code auf, wie diese Methoden implementiert werden. Irgendwelche Hinweise?

+1

diese Methoden sind Servlet 3.1, nicht Servlet 3.0 –

+0

@BrianClozel Dank für den Hinweis mich, aktualisiert die Frage – Marco

+0

hast du das umsetzen? – yathirigan

Antwort

3

können Sie MockHttpServletRequest im Frühjahr Rahmen prüfen

Der Quellcode gefunden here

könnte Seit dem Frühjahr Open Source Sie aus dem Code mit Apache2 Lizenz ist und bauen Sie Ihre eigene Version starten können.

+0

Ich sehe nicht, wo ich die erforderlichen Informationen finden kann. – Marco

+0

Bearbeiten Sie die Antwort mit einem Link zum Quellcode – Giovanni

+0

haben Sie dies implementiert? – yathirigan

12

Beispielimplementierung:

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"); 
     } 
    } 
} 
Verwandte Themen