Red de conocimiento informático - Conocimiento informático - ¿Cómo obtener el contenido de HttpServletResponse?

¿Cómo obtener el contenido de HttpServletResponse?

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

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 {

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()

}

}

}

}

}