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.
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:
An der Stelle "hier" könnte ich nun auf den HTML-Output zugreifen-
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?
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.
Code:
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:
Code:
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-
Code:
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?