Comment apporter un document binaire basé sur le document HTML Avec des filtres dans Java

Cela peut être un peu déroutant, mais j'ai des problèmes. Mon objectif est de prendre le document d'entrée HTML, puis traiter ce document et utiliser des données HTML Pour afficher le document d'image. Par exemple, l'utilisateur demandera URL Avec une action = png dans la rangée de requête, puis le filtre sera appelé pour URL et document d'image de sortie.

J'ai tout essayé, mais dans mon environnement /Websphere/Je peux afficher un seul type. Si le type d'entrée text/html, Je ne peux que retirer le document texte, mais je ne peux pas retirer un document binaire. Pourquoi? Parce que chaque fois que je reçois une exception d'état illégale.

[1/29/09 17:59:57:576 EST] 00000020 SystemErr R java.lang.IllegalStateException: SRVE0209E: L'écrivain est déjà reçu
[1/29/09 17:59:57:576 EST] 00000020 SystemErr R dans com.ibm.ws.webcontainer.srt.SRTServletResponse.getOutputStream/SRTServletResponse.java:505/

J'utilise pseudocode pour ne pas révéler tout votre code:


<filter>
<filter-name>TestFilter</filter-name>
<filter-class>
com.util.TestFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/index_test2.html</url-pattern>
</filter-mapping>


Code de la classe de wrapper essentiellement:


public class ContentCaptureServletResponse extends HttpServletResponseWrapper { 
private ByteArrayOutputStream contentBuffer;
private PrintWriter writer;
public PrintWriter getWriter// throws IOException {
if /writer == null/ {
contentBuffer = new ByteArrayOutputStream//;
writer = new PrintWriter/contentBuffer/;
}
return writer;
}
public String getContent//{
try {
writer = getWriter//;
} catch /IOException e/ {
e.printStackTrace//;
}
writer.flush//;
String xhtmlContent = new String/contentBuffer.toByteArray///;
System.out.println/xhtmlContent/;
return xhtmlContent;
}
}


Et le code de filtrage est:


public void doFilter/ServletRequest req, ServletResponse resp, FilterChain filterChain/ throws IOException, ServletException {

HttpServletRequest request = /HttpServletRequest/ req;
HttpServletResponse response = /HttpServletResponse/ resp;
final String renderType = request.getParameter/"R"/;
final String renderClassName = request.getParameter/"C"/;
if //renderType != null/ && /renderClassName != null// {
try {
this.setFilterChain/filterChain/;
response.setContentType/"image/png"/;
PrintWriter out = response.getWriter//;
// I call getWriter but not BOTH!
//response.getOutputStream//;
response.getWriter//;

// Build up the HTML document into a string.
CaptureResponse capContent = new CaptureResponse/response/;
this.mainFilterChain.doFilter/req, /;
String myString = capHtmlContent.getContent//;

// What I really want to do here is output an output stream
// so I can write a binary image
processStr/myString/;
response.getOutputStream//;
response.write/binaryimage/

} catch /Exception e/ {
e.printStackTrace//;
}
// No data will be output to the user.
} else {
filterChain.doFilter/request, response/;
} // End of if-else
} // End of the method.


Le code fonctionne si je veux prendre une sorte de document de texte d'entrée html. Je suppose qu'en raison du flux ouvert printwriter. Mais j'ai eu des problèmes avec la transition vers un autre format. Fondamentalement parce que je ne peux pas appeler response.getOutputStream//
Invité:

Edmond

Confirmation de:

Le problème semble être que vous ouvrez l'outil d'enregistrement de réponse avant d'envelopper la réponse.

Il semble que vous devriez être capable de le faire:


this.setFilterChain/filterChain/;
CaptureContent capContent = new CaptureResponse/response/;
doFilter//
process//;
response.setContentType/"image/png"/;
response.getOutputStream//.write/imagedata/;


Vous pouvez certainement être sûr d'ouvrir comme écrivain et OutputStream

Catherine

Confirmation de:

Je n'ai pas d'expérience avec Websphere, Mais un problème courant est que vous essayez de manipuler le titre HTTP Après avoir déjà pris votre engagement d'envoyer le corps - dès que webserver A commencé à livrer du contenu, vous ne pouvez plus mettre à jour les titres, comme ils l'ont déjà été envoyés.

Vous devrez peut-être vous familiariser avec votre documentation et vos exemples. Par exemple, je ne comprends pas pourquoi vous appelez response.get*//, En fait, sans regarder le résultat. Êtes-vous sûr que cela est nécessaire ou est-ce parce que vous avez coupé votre code?

Pour votre santé,
FOLLER.

Pour répondre aux questions, connectez-vous ou registre