Tomcat 7.0.43 „INFO: Eroare la analizarea antetului de cerere HTTP” (Programare, Java, Tomcat, Servlets, Tomcat7)

confile a intrebat.
a intrebat.

Folosesc Tomcat 7.0.43 cu o aplicație websocket. Aplicația mea funcționează bine în Tomcat 7.0.42, dar cu 43 primesc următoarea ieșire atunci când încerc să accesez serverul meu pe websocket:

Sep 16, 2013 3:08:34 AM org.apache.coyote.http11.AbstractHttp11Processor process
INFO: Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

Consola browserului meu afișează următoarele:

WebSocket connection to 'ws://www.testapp.com/socket/notification/848df2e62fcf93e1b3?X-Atmosphere-tracking-i…Date=0&Content-Type=application/json;%20charset=UTF-8&X-atmo-protocol=true' failed: Unrecognized frame opcode: 5 

Iată jurnalul de acces pentru această cerere:

"GET /socket/notification/848df2e62fcf93e1b3?X-Atmosphere-tracking-id=0&X-Atmosphere-Framework=2.0.2-javascript&X-Atmosphere-Transport=websocket&X-Atmosphere-TrackMessageSize=true&X-Cache-Date=0&Content-Type=application/json;%20charset=UTF-8&X-atmo-protocol=true HTTP/1.1"

Ce s-a schimbat în Tomcat 7.0.43? Ce trebuie să schimb?

Comentarii

  • Puteți arăta anteturile HTTP pe care le trimiteți? –  > Por Sotirios Delimanolis.
  • @SotiriosDelimanolis vedeți jurnalul meu de acces. Vă ajută acest lucru? –  > Por confile.
  • poate acest răspuns vă poate ajuta: stackoverflow.com/questions/12583338/… –  > Por Tomer.
  • @fatman De ce Tomcat 7.0.43 nu ar trebui să suporte websocket-ul pe care îl folosesc cu Tomcat 7.0.42? Nu are niciun sens? –  > Por confile.
  • primiți failed: Unrecognized frame opcode: 5 așa că, în mod evident, problema este în acea zonă. Nu sunt familiarizat cu protocolul, dar m-am gândit că ar putea să vă dea un indiciu (poate ați setat un antet de versiune?). –  > Por Tomer.
10 răspunsuri
ben rhouma moez

Dacă aveți acest ascultător:

    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on"/>

pe server.xml, eliminați-l și încercați.Nu puteți utiliza un keystore dacă utilizați conectorul APR

Philippe

Pentru mine, problema a fost trecerea unui antet HTTP mai mare decât cel așteptat în mod normal. Am rezolvat-o prin setarea atributului maxHttpHeaderSize=”1048576″ pe nodul Connector din server.xml.

Kimchi Man

Dacă există prea multe cookie-uri în cache, se strică serverul (dimensiunea unui antet de cerere este prea mare!). Ștergerea cookie-urilor poate rezolva și această problemă.

Comentarii

  • Eu am avut problema cu httpclient, am folosit method.addHeader în loc de method.setHeader –  > Por wutzebaer.
  • am doar un singur antet atașat și anume tipul de conținut și tot primesc aceeași eroare. mă puteți sfătui? –  > Por user641887.
  • @user641887, atunci probabil că problema dvs. nu provine de la dimensiunea antetului de cerere –  > Por Kimchi Man.
nkatsar

Am avut o problemă similară, trimiteam o cerere POST (folosind pluginul RESTClient pentru Firefox) cu date în corpul cererii și primeam același mesaj.

În cazul meu acest lucru s-a întâmplat pentru că încercam să folosesc protocolul HTTPS într-o instanță locală Tomcat unde HTTPS nu era configurat.

Comentarii

  • da, același lucru în cazul meu a fost o greșeală de scriere pe care cineva a încercat să o facă localhost:8080 –  > Por Kalpesh Soni.
  • Chiar și în cazul meu aceasta este problema, unul dintre dezvoltatorii care lovește din postman cu https. –  > Por Murali.
Gondy

Verificați, dacă nu solicitați accidental protocolul HTTPS în loc de HTTP.

Am trecut cu vederea faptul că am solicitat https://localhost:... în loc de http://localhost:... și a rezultat acest mesaj ciudat…

Piotr K.

Problema mea apare atunci când încerc să deschid https. Eu nu folosesc SSL.

Este Tomcat bug.

Astăzi 12/02/2017 cea mai nouă versiune oficială din depozitele Debian este Tomcat 8.0.14

Soluția este să descărcați de pe site-ul oficial și să instalați cel mai nou pachet de Tomcat 8, 8.5, 9 sau faceți upgrade la cea mai nouă versiune(8.5.x) de la jessie-backports

Debian 8

Adăugați la /etc/apt/sources.list

deb http://ftp.debian.org/debian jessie-backports main

Apoi actualizați și instalați Tomcat din jessie-backports

sudo apt-get update && sudo apt-get -t jessie-backports install tomcat8

Comentarii

Abhishek Soni

Am încercat toate cele de mai sus, nimic nu a funcționat pentru mine. apoi am schimbat numerele de port tomcat atât HTTP/1.1 cât și portul de administrare Tomcat și s-a rezolvat.

Văd că alte soluții de mai sus au funcționat pentru oameni, dar merită să încercați aceasta dacă niciuna dintre cele de mai sus nu funcționează.

Mulțumesc tuturor!

Atais

În cazul nostru s-a dovedit că eroarea s-a întâmplat pentru că avem un fișier personalizat filter în aplicația noastră care face HttpServletResponse sendRedirect() la alte url-uri.

Din anumite motive, redirecționarea nu închide fereastra keep-alive starea conexiunii, de unde și excepția de timeout.

Am verificat cu Tomcat Docs și când am dezactivat maxKeepAliveRequests prin setarea valorii sale la 1 și eroarea nu a mai apărut.

Deocamdată nu avem o soluție reală pentru această eroare.

Lujun Zhou

Dacă nu doriți să vă actualizați Tomcat, adăugați această linie în fișierul dvs. catalina.properties

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

Acesta funcționează pentru minehttp://www.zhoulujun.cn/zhoulujun/html/java/tomcat/2018_0508_8109.html

Promise Preston

Am avut această problemă atunci când am lucrat la un proiect Java în Debian 10 cu Tomcat ca server de aplicații.

Problema a fost că aplicația avea deja https definită ca protocol implicit, în timp ce eu foloseam http pentru a apela aplicația în browser. Astfel, când încerc să execut aplicația, primesc următoarea eroare în fișierul jurnal:

org.apache.coyote.http11.AbstractHttp11Processor process
INFO: Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

Am încercat totuși să folosesc https în browser, dar nu s-a conectat și a apărut eroarea:

Iată cum am rezolvat problema:

Aveți nevoie de un certificat pentru a configura https pentru aplicație. Mai întâi a trebuit să creez un keystore pentru aplicație, mai degrabă un certificat auto-semnat pentru aplicația https protocol:

sudo keytool -genkey -keyalg RSA -alias tomcat -keystore /usr/share/tomcat.keystore

Notă: Trebuie să aveți Java instalat pe server pentru a putea face acest lucru. Java poate fi instalat utilizând sudo apt install default-jdk.

În continuare, am adăugat un fișier https Conectorul serverului Tomcat pentru aplicația din fișierul de configurare a serverului Tomcat (/opt/tomcat/conf/server.xml):

sudo nano /opt/tomcat/conf/server.xml

Adăugați următoarele la configurația aplicației. Observați că keystore și parola sunt specificate. De asemenea, se specifică un port pentru aplicația https care este diferit de portul pentru protocolul http protocol:

<Connector protocol="org.apache.coyote.http11.Http11Protocol"
           port="8443" maxThreads="200" scheme="https"
           secure="true" SSLEnabled="true"
           keystoreFile="/usr/share/tomcat.keystore"
           keystorePass="my-password"
           clientAuth="false" sslProtocol="TLS"
           URIEncoding="UTF-8"
           compression="force"
           compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css"/>

Așadar, configurația completă a serverului pentru aplicație arată astfel în fișierul Tomcat server configuration file (/opt/tomcat/conf/server.xml):

<Service name="my-application">
  <Connector protocol="org.apache.coyote.http11.Http11Protocol"
             port="8443" maxThreads="200" scheme="https"
             secure="true" SSLEnabled="true"
             keystoreFile="/usr/share/tomcat.keystore"
             keystorePass="my-password"
             clientAuth="false" sslProtocol="TLS"
             URIEncoding="UTF-8"
             compression="force"
             compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css"/>

  <Connector port="8009" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443" />

  <Engine name="my-application" defaultHost="localhost">
     <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
    </Realm>

    <Host name="localhost"  appBase="webapps"
          unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
             prefix="localhost_access_log" suffix=".txt"
             pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    </Host>
  </Engine>
</Service>

De data aceasta, când am încercat să accesez aplicația din browser folosind:

https://my-server-ip-address:https-port

În cazul meu a fost:

https:35.123.45.6:8443

a funcționat bine. Deși a trebuit să accept un avertisment care a adăugat o excepție de securitate pentru site-ul web, deoarece certificatul utilizat este unul auto-semnat.

Asta e tot.

Sper că acest lucru vă ajută