Causas comunes y ejemplos de solicitud incorrecta HTTP 400 en Tomcat
En el desarrollo web, las solicitudes HTTP 400 incorrectas son un problema común pero difícil de localizar, generalmente porque la solicitud no cumple con los estándares HTTP. La razón parece intuitiva, pero localizar estos problemas a menudo requiere mucho esfuerzo. Hay varias dificultades:
En este artículo, compartiremos ejemplos de la vida real de entornos de producción reales.
Este artículo está basado en tomcat-embed-core-9.0.29
Para obtener más información, consulte la siguiente publicación del blog
Debido a la actualización de LB, el tráfico Después de cambiar del LB antiguo al nuevo LB, todas las respuestas de algunos clientes se convirtieron en 400 MALA SOLICITUD.
Ejemplo de cabeceras de solicitud enviadas por el cliente. "VERSIÓN DE LA APLICACIÓN: 519", el espacio antes de los dos puntos es un carácter ilegal.
La lógica de llamadas de Tomcat es la siguiente. En el método parseHeader(), el método isToken() se utiliza para comprobar caracteres ilegales en el encabezado de la solicitud.
org.apache.coyote.http11.Http11Processor#service: parseHeaders y captura IllegalArgumentException
org.apache.coyote.http11.Http11Processor#service: parseHeaders y captura IllegalArgumentException
org.apache.coyote.http11.Http11Processor#service: método parseHeader() y detecta una excepción de carácter ilegal. Http11.Http11InputBuffer#parseHeader: parseHeaders y capture IllegalArgumentException en skipLine(). IS_TOKEN es un mapa de bits utilizado para almacenar caracteres ilegales, incluidos '''', ''('')'''', etc.
org.apache.coyote.http11.Http11InputBuffer#skipLine: genera una excepción
Las siguientes son situaciones en las que se devolverá una solicitud incorrecta HTTP 400 en tomcat-embed-core- 9.0.29 Resumen, con ejemplos.
Los siguientes ejemplos son todos mensajes HTTP. El caso 0 es una solicitud que devuelve correctamente 200. Los siguientes ejemplos se basan en el caso 0, resaltando los cambios en naranja y resaltando las palabras clave que conducen a 400 en rojo, de modo que. Explique el problema de manera más intuitiva.
Muestra 200
Muestra 200
org.apache.coyote.> Muestra 400
org.apache.coyote.AbstractProcessor#line 337
Lógica de caracteres ilegal: org.apache.tomcat.util.http.HttpParser.DomainParseState#next
400 Ejemplo
org.apache.coyote.AbractProcessor #line 337
Lógica de caracteres ilegal: org.apache.tomcat.util.http.
Sin ejemplo
org.apache.coyote.http11.Http11Processor#line 311
Juego de caracteres: org.apache.tomcat.util.http.parser.DomainParseState#next 400 Ejemplo p> p>
9. El nombre del protocolo en la línea inicial es ilegal
org.apache.coyote.http11
org.apache.coyote.http11.Http11Processor#. línea 713
Juego de caracteres: org.apache.tomcat.util.http.parser.
Muestra 400
org.apache.coyote.http11.Http11Processor# línea 713
Conjunto de caracteres: org.apache.tomcat.util.http.parser. Ejemplo
12. Múltiples longitudes de contenido en encabezados de solicitud
org.apache.coyote.http11.Http11Processor#line 741
400 Ejemplo