Browsererkennung

(Auszug aus "Java und XSLT" von Eric M. Burke)

Eine Stärke von XSLT ist seine Fähigkeit, Daten und Präsentation zu trennen. Wie Sie wissen, müssen nur verschiedene XSLT-Stylesheets geschrieben werden, um unterschiedliche Transformationen zu unterstützen. Es muß nur herausgefunden werden, welches Stylesheet benutzt werden soll. In einer Webanwendung liefert der HTTP-Header User-Agent die Lösung.

HTTP-Anfragen bestehen aus einem Header und dem Inhalt. Der Header besteht aus Name-Wert-Paaren, über die Client und Server zusätzliche Informationen austauschen können. Der Text aus dem folgenden Beispiel zeigt eine komplette HTTP-Anfrage von Netscape 6.0 unter Windows 2000.

Beispiel: HTTP-Anfrage von Netscape 6

GET / HTTP/1.1
Host: localhost:80
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; m18) Gecko/20001108 Netscape6/6.0
Accept: */*
Accept-Language: en
Accept-Encoding: gzip,deflate,compress,identity
Keep-Alive: 300
Connection: keep-alive

Um den Typ des Browsers zu bestimmen, muß der User-Agent geparst und ausgewertet werden. Aufgrund dieser Informationen kann das Servlet ein passendes XSLT-Stylesheet auswählen, das die Stärken und Schwächen des entsprechenden Browsers berücksichtigt.

Leider existieren hunderte User-Agent-Variationen, und die Browserhersteller halten kein Standardformat ein. Die gebräuchlichsten Browser können aber mit vergleichsweise geringem Aufwand bestimmt werden. Die folgende Tabelle zeigt User-Agents für häufig verwendete Browser.

Tabelle: Gebräuchliche Werte für User-Agent

User-Agent Browser
Lynx/2.8rel.3 libwww-FM/2.14 Lynx 2.8rel3
Mozilla/4.0 (compatible; MSIE 4.0; Windows NT) Internet Explorer 4.0
Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) Internet Explorer 5.5
Mozilla/4.08 [en] (WinNT; U ;Nav) Netscape 4.08
Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; m18)
Gecko/20001108 Netscape 6/6.0
Netscape 6
Mozilla/3.0 (compatible; Opera/3.0; Windows 95/NT4) v3.1 Opera 3.0

Der Browser Lynx ist der gebräuchlichste textbasierte Browser. Wenn der User-Agent also mit Lynx beginnt, kann Ihre Webanwendung ein XSLT-Stylesheet verwenden, das alle Graphiken ausspart.

Die drei populärsten Browser sind der Microsoft Internet Explorer, der Netscape Navigator und Opera von Opera Software. Von diesen drei Browsern war der Navigator, dessen User-Agent immer mit Mozilla beginnt, als erster verfügbar. In den frühen Tagen der Webentwicklung stellten viele Websites nur Netscape-Browsern ausgefeilte Versionen zur Verfügung.

Als der Microsoft Internet Explorer auf den Markt kam, mußte dessen User-Agent ebenfalls mit Mozilla beginnen, damit er mit existierenden Websites kompatibel war. Deshalb können Sie nicht einfach auf Mozilla prüfen, um den Browsertyp zu bestimmen. Wie Sie in obiger Tabelle sehen, beinhalten Microsoft-Browser den Text MSIE gefolgt von einer Versionsnummer, wodurch sie einfach zu erkennen sind.

Der Eintrag für den neueren Opera-Browser beginnt ebenfalls mit Mozilla. Der User-Agent enthält aber immer Opera/[version];, wobei [version] z.B. 2.0 oder 3.0 ist. Mit diesen Regeln im Hinterkopf könnte unser Algorithmus zur Browsererkennung etwa so aussehen:

if (beginnt-mit "Lynx") {
  Browser kann nur Text darstellen
}
else if (enthält "MSIE") {
  es handelt sich um den Internet Explorer
}
else if (enthält "Opera") {
  es handelt sich um den Opera-Browser
}
else if (beginnt-mit "Mozilla") {
  der Browser ist Netscape-kompatibel
}
else {
  unbekannter Browser
}

In einem Servlet wird der folgende Code verwendet, um den Wert des User-Agent zu bestimmen:

protected void doGet(HttpServletRequest req, HttpServletResponse res)
    throws IOException, ServletException {
  String userAgent = req.getHeader("User-Agent");
  String xslt = null;
  if (userAgent.startsWith("Lynx")) {
    xslt = "textHomePage.xslt";
  } else {
    xslt = "htmlHomePage.xslt";
  }
  ...

Für eine komplexere Anwendung könnte es wünschenswert sein, eine Hilfsklasse zu verwenden, die den Browser, seine Versionsnummer und wenn möglich die Rechnerplattform ermittelt. Obwohl Sie sicherlich mit den Operationen der Klasse java.lang.String eine solche Hilfsklasse schreiben könnten, ist es einfacher, auf eine existierende API zurückzugreifen. In der folgenden Abbildung wird die Ausgabe eines Servlets gezeigt, das verschiedene Informationen über den Browser ermittelt.

Browsererkennung

Abbildung: Browsererkennung

Dieses Servlet verwendet die Klasse org.apache.turbine.util.BrowserDetector, die ein Teil von Apaches Turbine Web Application Framework ist. (Das Beispiel beruht auf der Version 2.1 von Turbine.) Diese Klasse ist nur von einer anderen Komponente von Turbine abhängig, Sie können also entweder die Referenz auf die Klasse RunData von Turbine entfernen oder die Turbine JAR-Datei zu Ihrem CLASSPATH hinzufügen. (Lesen und befolgen Sie die Lizenzvereinbarungen von Apache, wenn Sie diese Klasse aus Turbine extrahieren und verwenden wollen.) Der Code des Servlets ist im folgenden Beispiel zu sehen.

Beispiel: BrowserID.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.turbine.util.BrowserDetector;

public class BrowserID extends HttpServlet {
  
   protected void doGet(HttpServletRequest req, HttpServletResponse res)
           throws IOException, ServletException {
        BrowserDetector bd = new BrowserDetector(req.getHeader(
                 "User-Agent"));
             
        res.setContentType("text/plain");
             
        PrintWriter pw = res.getWriter( );
        pw.println("User-Agent : " + bd.getUserAgentString( ));
        pw.println("Unterstütze CSS : " + bd.isCssOK( ));
        pw.println("JavaScript : " + bd.isJavascriptOK( ));
        pw.println("Browser-Name : " + bd.getBrowserName( ));
        pw.println("Plattform : " + bd.getBrowserPlatform( ));
        pw.println("Version : " + bd.getBrowserVersion( ));
   }
}

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Java & XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2002 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Java und XSLT" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de