Wie Header eines Streams manipulieren?

du hast recht. war eigentlich müll :)
Aber nach langem google habe ich eine lösung gefunden. Ich habe meinen eigenen Response Wrapper und OutputStream geschrieben. Eigentlich sollte es funktionieren aber ich kriege noch immer eine leere Seite. Das Einzige was er mir dann anzeigt ist PRE und POST. Vllt findet jmd den fehler

Hier der Filter:
Code:
publicvoid doFilter(ServletRequest request, ServletResponse response,
FilterChain filter) throws IOException, ServletException {

OutputStream out = response.getOutputStream();
out.write(new String("<H1>PRE</H1>").getBytes());


SAPFilterResponse wrapper = new SAPFilterResponse((HttpServletResponse) response);
filter.doFilter(request, wrapper); 

// wrapper.getData() erwidert nichts. Praktisch leer, warum?
out.write(wrapper.getData());
out.write(new String("<H1>POST</H1>").getBytes());
out.close();
}

Der Response Wrapper
Code:
package testSuite;
 
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
 
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
 
publicclass SAPFilterResponse extends HttpServletResponseWrapper {

private ByteArrayOutputStream output; 
privateintcontentLength; 
private String contentType;

public SAPFilterResponse(HttpServletResponse response) {
super(response); 
this.output = new ByteArrayOutputStream();
}

public ServletOutputStream getOutputStream() { 
returnnew SAPFilterOutputStream(this.output); 
}

publicbyte[] getData() { 
returnthis.output.toByteArray(); 
}

public PrintWriter getWriter() { 
returnnew PrintWriter(this.getOutputStream(), true); 
}

publicvoid setContentType(String s) {
this.contentType = s;
super.setContentType(s);
}

public String getContentType() {
returnthis.contentType;
}

publicvoid setContentLength(int length) {
this.contentLength = length;
super.setContentLength(length);
}

publicint getContentLength() {
returnthis.contentLength;
}
}

Und der eigene OutputStream
Code:
package testSuite;
 
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
 
import javax.servlet.ServletOutputStream;
 
publicclass SAPFilterOutputStream extends ServletOutputStream {
private DataOutputStream stream;

public SAPFilterOutputStream(OutputStream output) {
this.stream = new DataOutputStream(output);
}

publicvoid write(int b) throws IOException { 
this.stream.write(b); 
}

publicvoid write(byte[] b) throws IOException { 
this.stream.write(b); 
}

publicvoid write(byte[] b, int off, int len) throws IOException { 
this.stream.write(b, off, len); 
}
}

web.xml
Code:
<filter>
<filter-name>SAPFilter</filter-name>
<filter-class>testSuite.SAPFilter</filter-class>
</filter>
 
<filter-mapping>
<filter-name>SAPFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

Ich hoffe, jmd findet meinen dummen fehler! :rolleyes:

gruß
Thorsten
 
kurzer nachschuh:

das script funktioniert doch, nur hat er probleme, wenn in der jsp der inhalt von f:view eingerahmt ist. Bsp:
Code:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
   
<f:view> 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <p>test mich</p>
</body>
</html>
</f:view>
Dann bekommt er eine leere Seite. Wenn ich aber <f:view></f:view> weglasse. dann funkioniert es wunderbar.

Gruß
Thorsten
 
Zurück