2010-06-24 17 views
10

Estoy ejecutando un servlet en Tomcat 6.0.26. El servlet acepta la carga de archivos desde el cliente mediante HTTP POST. Me gustaría detener la carga del archivo desde el lado HttpServlet. Probé los siguientes métodos sin suerte:Cómo cerrar una conexión HTTP desde el HttpServlet

  1. cerrar la solicitud InputStream
  2. código de error de envío HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE y la respuesta al ras
  3. hacer 1 y 2 en un filtro

Googled pero no encontré respuestas directas. Por favor asesorar soluciones.

Gracias.

Respuesta

5

Esto no es posible utilizando el Servlet estándar ni la API FileUpload de Commons. Básicamente, para poder abortar la conexión de inmediato, debes agarrar físicamente el conector subyacente y cerrarlo. Sin embargo, este socket está controlado por el servidor web. Ver también esta pregunta relacionada: How to explicitly terminate http connection from server with no response header.

Sin embargo, algunas pruebas han confirmado que Commons FileUpload no almacena en búfer todo el archivo en la memoria cuando su tamaño excede el límite. Leerá la secuencia de entrada, pero simplemente ignorará y descartará los bytes leídos (también los que ya se leyeron). Entonces la eficiencia de la memoria no es necesariamente el problema aquí.

Para solucionar el problema real, básicamente le gustaría validar el tamaño del archivo en el lado del cliente en lugar del servidor. Esto es posible con un applet de Java o una aplicación Flash. Por ejemplo, respectivamente JumpLoader y SWFUpload.

1

pregunta es mucho más o menos un duplicado de Aborting upload from a servlet to limit file size

¿Usted intentó utilizar Apache Commons ?

Hay un método setFileSizeMax en el objeto del servidor que representa una carga de archivo de una solicitud.

+0

Intenté FileUpload pero no funciona para mí. Lo que quiero es detener el proceso de carga por completo. Pero con setFileSizeMax de FileUpload, no impedirá que el cliente cargue todo el contenido al servidor (lo que cuesta el ancho de banda del servidor). – Jason

+0

@Jason: Necesita usar [modo de transmisión] (http://commons.apache.org/fileupload/streaming.html). De forma predeterminada, lee el archivo en la memoria/disco de temp primero. – BalusC

+1

@BalusC: lo que quiero es terminar el proceso de carga del cliente. El modo de transmisión aún recibirá todo el archivo antes de hacer algo al respecto. Es demasiado tarde. – Jason

3

aquí hay alguna solución alocada: puede escribir (o encontrar en algún lugar) alguna aplicación autónoma de firewall basada en Sockets que maneja solicitudes HTTP, analiza encabezados y si la solicitud coincide con algunas de sus condiciones personalizadas - firewall lo reenvía a Tomcat, de lo contrario devuelve Respuesta de error HTTP O puede intentar sintonizar Apache < -> Tomcat con algunas reglas de Apache.

4

Esto no es posible con las API estándar. Y estás violando algunos estándares de protocolo/RFC si lo haces. Entonces, ¿por qué harías eso?

En su lugar, envíe una respuesta "Conexión: cerrar" (encabezado http) sin cuerpo http.

Cuestiones relacionadas