¿Cómo obtener el contenido de HttpServletResponse?
Antecedentes: en el marco SPRING, hay un servidor que necesita proporcionar múltiples servicios de formulario, de los cuales múltiples formularios solo devuelven formularios que vale la pena mostrar (de hecho, la lógica interna de los datos son exactamente iguales:
Formulario 1: JSONP({ "clave1": valor1, "clave2": valor2, "clave3": valor3, ...})
Formulario 2: {"key1": value1, "key2": value2, "key3": value3, ....}
Para que el código de procesamiento empresarial en segundo plano sea el mismo ( sin hacer ninguna distinción), el motivo del filtro es ahora, devolver el procesamiento de la interfaz, agregar: JSONP(...) según sea necesario
Los principales pasos de implementación son los siguientes:
1. Configurar el filtro en web.xml
lt;filtergt;
lt;filter-namegt;RewriteResponselt;/filter-namegt;
lt;filter-classgt ;RewriteResponselt;/filter-namegt;
lt;filter-classgt;com.robin.filter.RewriteResponselt;/filter-namegt;
2.RewriteResponselt;/filter-classgt;
lt;/filtergt;
lt;filter-mappinggt;
lt;filter-namegt;RewriteResponselt;/filter-namegt;
lt;servlet-namegt;/*lt; /servlet-namegt;
lt;/filter-mapping gt;
// La barra asterisco indica que coincide con cualquier solicitud p>
2. El enfoque es el filtrado RewriteResponse
clase pública RewriteResponseFilter extiende el filtro {
descripción de cadena pública() {
//TODO generar automáticamente trozo de método
Devuelve nulo ;doFilter(request, ResponseWrapper);
} catch (ServletException e) {
//TODO bloque de captura generado automáticamente
e.printStackTrace();
}
String respuestaContenido = new String(responseWrapper.getOutputStream().write(responseToSend);
}
byte privado[ ] restResponseBytes(respuesta RestResponse) lanza IOException {
Cadena serializada = new ObjectMapper().writeValueAsString (respo
nse);
return serialized.getBytes("UTF-8");
}
}}
3. Clase (para devolución)
clase pública RestResponse implementa Serializable {
estado int privado;
mensaje de cadena privado;
datos de objeto privado ;
respuesta pública de resto (estado int, mensaje de cadena, datos del objeto) {
this.status = estado;
this.message = mensaje;
p>
this.data = datos;
this.data = datos.
datos = datos;
}
public int getStatus() {
estado de devolución;
}
public void setStatus(int status) {
this.status = status;
}
public String getMessage() {
return mensaje;
}
public void setMessage(mensaje de cadena) {
this.message = mensaje;
}
Objeto público getData() {
datos de retorno;
}
setData vacío público (datos del objeto) {
esto .datos = datos;
}
}
}
}
}
4. Implementar la extensión especificada por ServletOutputStream
la clase pública FilterServletOutputStream extiende ServletOutputStream {
Salida de DataOutputStream;
FilterServletOutputStream público (salida de OutputStream) {
this.output = new DataOutputStream(salida);
}
@ Override
public void write(int arg0) lanza IOException { p >
salida.write(arg0);
}
@Override
escritura pública vacía (byte[] arg0, int arg1, int arg2 ) lanza IOException {
output.write(arg0, arg1, arg2);
}
@Override
escritura pública vacía ( byte [] arg0) arroja IOException {
output.write(arg0);
}
}
}
5. Reemplazar la salida original
la clase pública ResponseWrapper extiende HttpServletResponseWrapper {
Salida ByteArrayOutputStream;
FilterServletOutputStream filterOutput;
HttpResponseStatus estado = HttpResponseStatus.
Respuesta públicaWrapper(respuesta HttpServletResponse) {
super(respuesta);
salida = new ByteArrayOutputStream();
}
@Override
servletOutputStream público getOutputStream() lanza IOException {
if (filterOutput == null) {
filterOutput = nuevo FilterServletOutputStream(salida);
}
return filterOutput;
}
byte público[] getDataStream() {
devuelve salida.toByteArray()
}; p>
}
}
}
}