# Servlet Filter zur Stringersetzung



## citizen_erased (7. Jan 2005)

Hallo!

Ich bekomme folgendes gerade überhaupt nicht hin.
(M)ein Servlet  erzeugt irgend einen HTML-Output. Ich würde gerne bestimmte Stellen im HTML-Quellcode austauschen (simpler Replace).
Dazu, dachte ich mir, nehme ich am besten einen Servletfilter.



```
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;        
        chain.doFilter(request,response);
        // hier

}
```

Wenn ich es richtige verstanden habe, sollte ich an der Stelle "hier" das Response-Objekt bearbeiten.
Dazu wäre ein ResponseWrapper nötig. über den ich den Datenstrom beeinflussen kann.
Ganz klassich:


```
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ResponseWrapper extends HttpServletResponseWrapper {    
    protected HttpServletResponse origResponse = null;
    protected ServletOutputStream stream = null;
    protected PrintWriter writer = null;
    protected ByteArrayOutputStream cacheStream = new ByteArrayOutputStream();
    
    /**
     * 
     * @param response
     */
    public ResponseWrapper(HttpServletResponse response) {
        super(response);
        origResponse = response;
        cacheStream = new ByteArrayOutputStream();
    }
    
    /**
     * 
     */
    public void flushBuffer() throws IOException {
        stream.flush();
    }
    
    /**
     * 
     */
    public ServletOutputStream getOutputStream() throws IOException {
        if (writer != null) {
            throw new IllegalStateException("getWriter() has already been called!");
        }
        if (stream == null) {
            stream = createOutputStream();
        }
        return stream;
    }
    
    /**
     * 
     */
    public PrintWriter getWriter() throws IOException {
        if (writer != null) {
            return writer;
        }
        
        if (stream != null) {
            throw new IllegalStateException("getOutputStream() has already been called!");
        }
        
        stream = createOutputStream();
        writer = new PrintWriter(new OutputStreamWriter(stream,"UTF-8"));
        return writer;
    }    
    
    /**
     * 
     * @return
     * @throws IOException
     */
    public ServletOutputStream createOutputStream() throws IOException {
        CacheOutputStream cacheOutputStream = new CacheOutputStream(cacheStream); 
        return cacheOutputStream;
    }
    
    /**
     * 
     * @return
     */
    public ByteArrayOutputStream getByteArrayOutputStream() {
        return cacheStream;
    }

}
```


An der Stelle "hier" könnte ich nun auf den HTML-Output zugreifen-




```
ResponseWrapper wrappedResponse = new ResponseWrapper(response)
            ByteArrayOutputStream baos = wrappedResponse.getByteArrayOutputStream();                        
            byte[] fileContent = baos.toByteArray();
             // byte-Array bearbeiten
```

Allerdings habe ich nun überhaupt keine Idee, wie ich das bearbeitete byte-Array in den gewrappten Response einbringen kann.
Ich hole mir den Writer des Wrappers.. aber nix passiert.... 
bwz. Die Ausnahme  java.io.IOException"Cannot write to a closed output stream" wird geworfen


Hat jemand sowas schon mal gemacht und auch Erfolg dabei gehabt?


----------



## meez (7. Jan 2005)

Schau mal hier: http://htmlparser.sourceforge.net/


----------



## citizen_erased (12. Jan 2005)

danke für den hinweis...hui..ist mit aber zuviel overhead.

einen fehler habe ich gefunden.

meine filterkette besteht aus mehreren filtern

user->request->filter1->request->filter2->request->filter3->anwendung
user<-response<-filter1<-response<-filter2<-response<-filter3<-anwendung

filter2 hat allerdings die filterkette unterbrochen, nicht den respbnse weitergegeben, sondern das ergebnis direkt dem user üebrmittelt...


----------

