Wie Header eines Streams manipulieren?

Thopeto

Erfahrenes Mitglied
Hallo!

Ich habe einen Filter geschrieben, der den Header wie Pragma, Date, Content-Type usw verändert. D. h. ich kann die Header Parameter setzen, wie ich es möchte. Dies funktioniert wunderbar, aber er zeigt mir dann eine leere Seite an. Hier mal der Code:

Code:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filter) throws IOException, ServletException {

String url = null;
if(request instanceof HttpServletRequest)
url = ((HttpServletRequest)request).getRequestURL().toString();

HttpServletRequest httpRequest = (HttpServletRequest)request;
HttpServletResponse httpResponse = (HttpServletResponse)response; 

String[] parameters = this.paramRequest.split("\\;");
for(int i = 0; i < parameters.length; i++) {
String[] values = parameters[i].split("\\=");
//System.out.println(values[0] + ": " + values[1]);

httpRequest.setAttribute(values[0], values[1]);
}

parameters = this.paramResponse.split("\\;");
for(int i = 0; i < parameters.length; i++) {
String[] values = parameters[i].split("\\=");
System.out.println(values[0] + ": " + values[1]);
httpResponse.addHeader(values[0], values[1]);
}


try {
ServletInputStream in = httpRequest.getInputStream();
ServletOutputStream os = httpResponse.getOutputStream();

// Copy the contents of the file to the output stream
byte[] buf = new byte[1024];
int count;
while ((count = in.read(buf)) >= 0) {
os.write(buf, 0, count);
}
in.close();


os.flush();
os.close();

filter.doFilter(httpRequest, httpResponse);
} catch(IOException e) {
System.out.println(e.getCause());
}
}

Die header parameter sind gesetzt aber wie gesagt, die eigentliche seite ist leer. Einer eine Idee?

gruß
Thorsten
 
Hi,

es könnte sein, dass der Filter abbricht, z.B. wenn eine Exception auftritt.
Dann gibt so ein Filter den Code 200 OK zurück, als ob alles erfolgreich beendet worden wäre.

Versuch mal statt System.out.println... folgendes zu machen:

} catch (IOException e) {
//System.out.println(e.getCause());
httpResponse.sendError(500, "Exception occured, Filtering aborted!");
}

500 ist der falsche Fehlercode hierfür, aber zum Testen langt es.
Habe Deinen Code aus zeitlichen Gründen noch nicht testen können, aber das wäre der naheliegenste Fehler. Es ist wichtig, im Falle eines Fehlers diesen auch in die Response zu schreiben, ansonsten ist die Seite leer.

Grüße, Tim
 
hi Tim,

ich habe deinen rat befolgt. Einen 500er Fehler brachte er nicht, dafür schrieb er was in die konsole:

Code:
29.09.2008 11:27:25 com.sun.faces.lifecycle.LifecycleImpl phase
WARNUNG: executePhase(RENDER_RESPONSE 6,com.sap.tc.ls.faces.context.UCFFacesContext@57e787) threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:314)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:408)
at com.sun.faces.application.ViewHandlerImpl.executePageToBuildView(ViewHandlerImpl.java:442)
at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:115)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at testSuite.SAPFilter.doFilter(SAPFilter.java:112)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:212)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:818)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:624)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Unknown Source)
29.09.2008 11:27:25 org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:314)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:408)
at com.sun.faces.application.ViewHandlerImpl.executePageToBuildView(ViewHandlerImpl.java:442)
at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:115)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at testSuite.SAPFilter.doFilter(SAPFilter.java:112)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:212)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:818)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:624)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Unknown Source)

soweit ich das verstehe, meint er doch, dass er die response bereits abgeschickt hat und man sie nicht naträglich verändern kann, richtig?

gruß
Thorsten
 
Hallo,

man kann den Response-Header nur dann manipulieren wenn noch nichts zum Client gesendet worden ist. Schau mal ob du du irgendwo vorher einen forward oder einen flush machst...

Gruß Tom
 
hi

habe ich gemacht. wenn ich os.flush() auskommentiere, dann zegt er mir eine leere seite mit content-length 0

wenn ich doFilter auskommentiere und os.flush() drin lasse, dann zeigt er mir eine seite mit 20 byte an. trotzdem leer.

wo ist das problem?! :confused:

gruß
Thorsten
 
Hallo,

ist dein Filter der erste in der Filterkette? Wenn nicht stell ihn mal an den Anfang und versuchs wieder. Außerdem musst du schauen, das vorher auch kein Respons -> out.println(...) gemacht wird.

Gruß Tom
 
hi,
ich habe nur den filter in meiner anwendung. auch sende ich keine response an den client. zumindest habe ich nichts mehr davon in meiner doFilter Funtkion stehen. ich raffs echt nicht.

gruß
Thorsten
 
Hi,

jepp, der SAPFilter ist meiner. Ich hab jetzt, wie du gesagt hast, os.flush() und os.close() auskommentiert und am ende kam ein fehler dabei heraus:

org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:565)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:426)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:408)
com.sun.faces.application.ViewHandlerImpl.executePageToBuildView(ViewHandlerImpl.java:442)
com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:115)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
testSuite.SAPFilter.doFilter(SAPFilter.java:112)

root cause

java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.catalina.connector.Response.getWriter(Response.java:604)
org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:197)
com.sun.faces.application.ViewHandlerResponseWrapper.flushContentToWrappedResponse(ViewHandlerResponseWrapper.java:131)
com.sun.faces.taglib.jsf_core.ViewTag.doStartTag(ViewTag.java:169)
org.apache.jsp.headerSetup_jsp._jspx_meth_f_005fview_005f0(headerSetup_jsp.java:127)
org.apache.jsp.headerSetup_jsp._jspService(headerSetup_jsp.java:103)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:390)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:408)
com.sun.faces.application.ViewHandlerImpl.executePageToBuildView(ViewHandlerImpl.java:442)
com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:115)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
testSuite.SAPFilter.doFilter(SAPFilter.java:112)

gruß
Thorsten
 
Hallo,

jetzt fliegt die Exception in deiner JSP... was machst du da überhaupt? In deiner JSP darfst du nach einem flush nichts mehr ausgeben...

Du kopierst hier nur bytes aus dem RequestStream in den ResponseStream wozu?

Gruß Tom
 

Neue Beiträge

Zurück