Avatar billede mergelspir Seniormester
10. maj 2022 - 16:39 Der er 5 kommentarer

Hvordan læser man en browsers header-rækkefølge?

Jeg er begyndt at interessere mig lidt for browser fingerprints, og har læst, at "The header order of each browser is fixed and cannot be changed in the browser settings."
Så derfor vil jeg gerne læse browsernes header-rækkefølge.

Jeg har forsøgt med:

Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames!=null && headerNames.hasMoreElements()) {
    String key = headerNames.nextElement();
}

Men jeg har konstateret, at .nextElement() ikke giver den samme rækkefølge, som browseren sender dem i.

Jeg leder derfor efter Java-alternativer.

Jeg kører min applikation på en Apache Tomcat på et webhotel, så jeg har ikke mulighed for at foretage ændringer i konfigurationen af Apache/Tomcat.
Avatar billede arne_v Ekspert
07. juni 2022 - 17:11 #1
Jeg har ingen løsning men vil da lige nævne det som ikke virker i håb om at det kan inspirere nogen til at finde en løsning som virker.

Normal request processing har læst headerne og gemt dem i en data struktur når servlet/JSP kaldes. Forskellig data struktur for forskellige servere. Tomcat's data struktur gør at headere hentes i en anden rækkefølge end indsættelse.

Et servlet filter synes ikke at løse problemet, da det bruger samme Request objekt som normal processing.

Så var der muligheden af at Tomcat header processing havde gode log kald indsat, så man kunne enable logging med en custom appender og hapse informationen i indsættelses rækkefølge den vej af. Men som jeg læste Tomcat source så er der ikke de nødvendige log kald.
Avatar billede mergelspir Seniormester
07. juni 2022 - 20:10 #2
"Forskellig datastruktur for forskellige servere."

1) Er Apache/Tomcat en Tomcat ovenpå en Apache?
Eller er de totalt vokset sammen som een enhed?
Jeg tænker på, om man måske kunne hente information direkte fra Apache serveren?!?

2) Er der Java webservere, der ikke bygger på Tomcat?
Jeg har kikket lidt på Resin, med den er - så vidt jeg kan forstå - blot et Tomcat-derivat.
SUNs oprindelige Java webserver var ikke Tomcat, men den eksisterer mig bekendt ikke mere.

3) Det undrer mig, at Tomcat smider brugbar information væk. Det lyder som en fejl i arkitekturen.
Avatar billede arne_v Ekspert
07. juni 2022 - 20:46 #3
re 1)

Navne kan være noget rod.

Strengt taget er der:

Apache Software Foundation = en open source organisation
Apache httpd = en open source web server (skrevet i C) vedligeholdes af ASF
Apache Tomcat = en open source servlet container (skrevet i Java) som vedligeholdes as ASF

Men i daglig tale kaldes de 3 ofte for:

Apache
Apache
Tomcat

og så er der forvirring.

Men det bliver værre endnu fordi Apache httpd kan bruges foran Apache Tomcat.

Det er helt almindeligt med:

----(HTTP port 80 eller HTTPS port 443)----Apache httpd----(HTTP port 8080)----Apache Tomcat

----(HTTP port 80 eller HTTPS port 443)----Apache httpd----(AJP port 8009)----Apache Tomcat

og så er navne forvirringen ved at være total.

Men tilbage til problemet i spørgsmålet så tror jeg ikke at en Apache httpd vil løse problemet.
Avatar billede arne_v Ekspert
07. juni 2022 - 20:51 #4
re 2)

Der er adskillige servlet containere.

Tomcat fra Apache
Jetty fra Eclipse
Undertow fra Redhat (IBM)
Resin fra Caucho

Mit indtryk er der vælges som:

fuld Java EE application server - inkluderer en servlet container valgt af leverandør (JBoss vælger Undertow etc.)

standalone servlet container - langt de de fleste vælger Tomcat

Spring Boot micro service - nogle vælger Tomcat, nogle vælget Jetty

lille special applikation med embedded servlet container og web server - de fleste vælger Jetty
Avatar billede arne_v Ekspert
07. juni 2022 - 20:55 #5
re 3)

Det virker som en mangel.

Det kunne have været løst på ihverfald to måder:

1) servlet specs kunne have krævet at headere returneres i original rækkefølge og de forskellige implementationer havde så været nød til at vælge en data struktur som kunne opfylde det krav

2) support for en "raw servlet" hvor man får en InputStream og en OutputStream i.s.f. en Request og en Response
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester