Comment puis-je lire un flux de sortie HttpServletReponses?
Je veux créer un filtre de Servlet qui lira le contenu de la réponse après son traitement et son achèvement et retournera ces informations en XML ou PDF ou autre. Mais je ne suis pas sûr de savoir comment obtenir des informations de L'objet HttpServletResponse. Comment puis-je obtenir cette information?
4 réponses
Ajoutez ceci au fichier java de filtre.
static class MyHttpServletResponseWrapper
extends HttpServletResponseWrapper {
private StringWriter sw = new StringWriter(BUFFER_SIZE);
public MyHttpServletResponseWrapper(HttpServletResponse response) {
super(response);
}
public PrintWriter getWriter() throws IOException {
return new PrintWriter(sw);
}
public ServletOutputStream getOutputStream() throws IOException {
throw new UnsupportedOperationException();
}
public String toString() {
return sw.toString();
}
}
Utilisez le code suivant:
HttpServletResponse httpResponse = (HttpServletResponse) response;
MyHttpServletResponseWrapper wrapper =
new MyHttpServletResponseWrapper(httpResponse);
chain.doFilter(request, wrapper);
String content = wrapper.toString();
La variable content a maintenant le flux de sortie. Vous pouvez également le faire pour le contenu binaire.
Spring a maintenant une fonctionnalité pour cela . Tout ce que vous devez faire est d'utiliser [ContentCachingResponseWrapper], qui a la méthode public byte[] getContentAsByteArray() .
Je suggère de faire WrapperFactory qui permettra de le rendre configurable, que ce soit pour utiliser ResponseWrapper par défaut ou ContentCachingResponseWrapper.
Je ne sais pas grand-chose que vous pouvez extraire des données d'un objet HttpServletResponse en tant que tel. Il peut être plus logique de structurer votre application de telle sorte que les demandes soient transmises par procuration aux gestionnaires appropriés et transmises avec des objets de transfert de données, à partir desquels vous pouvez générer la réponse finale appropriée. De cette manière, vous ne modifiez jamais plus d'un objet de réponse ou avez besoin de lire à partir de tels.
Pas une réponse directe, Je sais, mais c'est comme ça que je le ferais donner la question.
Je ne crois pas que vous puissiez nécessairement le faire étant donné que l'écriture dans le flux de sortie peut entraîner le vidage des données vers le client avant que les filtres de servlet ne soient invoqués après la population. Comme le suggère iftrue , une architecture différente serait souhaitable, pour générer votre XML (disons), puis régénérer dans le format de sortie que vous désirez.
EDIT: après avoir lu votre réponse à la publication de iftrue, si vous ne pouvez vraiment pas interférer avec le courant traitement, peut-être avez-vous besoin d'un servlet pour proxy votre demande, capturer la sortie de la sortie d'origine, puis munge le cas échéant. Très méchant, cependant :-(