Der User-Agent-String ist eine Zeichenkette, die von einem Client (z. B. Browser oder Mobile-App) an den Server gesendet wird, um dessen Eigenschaften wie Gerätetyp, Betriebssystem, Browser und Version mitzuteilen. Die Analyse des User-Agent-Strings kann nützlich sein, um Inhalte oder Dienste gezielt an verschiedene Geräte anzupassen, Statistiken zu erstellen oder Sicherheitsfunktionen zu implementieren.

Die Library Yauaa (Yet Another User-Agent Analyzer) ist eine leistungsfähige und leicht integrierbare Open-Source-Bibliothek, die sich speziell für das Parsen und Analysieren von User-Agent-Strings eignet. In diesem Artikel zeige ich, wie die Yauaa-Library in eine Spring-Boot-Anwendung integriert wird und wie sie genutzt werden kann, um die User-Agent-Daten serverseitig auszuwerten.


1. Einführung in Yauaa

Yauaa bietet eine flexible Möglichkeit, User-Agent-Strings in strukturierte Daten umzuwandeln. Die Library liefert detaillierte Informationen über:

  • Betriebssystem (inklusive Version)
  • Browser (inklusive Version)
  • Gerätetyp (z. B. Smartphone, Tablet, Desktop)
  • Marke und Modell
  • Bots oder Crawler (z. B. Googlebot)

Mit Yauaa lassen sich diese Informationen durch eine einfache API abrufen und weiterverarbeiten.


2. Integration in eine Spring-Boot-Anwendung

Schritt 1: Maven-Abhängigkeit hinzufügen

Um Yauaa in ein Spring-Boot-Projekt zu integrieren, muss die Abhängigkeit in der pom.xml des Projekts hinzugefügt werden:

<dependency>
    <groupId>nl.basjes.parse.useragent</groupId>
    <artifactId>yauaa</artifactId>
    <version>7.26</version>
</dependency>
Code-Sprache: HTML, XML (xml)

Schritt 2: Konfiguration der Yauaa-Instanz

Yauaa verwendet einen UserAgentAnalyzer, der die User-Agent-Strings analysiert. Dieser kann als Bean in einer Spring-Boot-Anwendung definiert werden:

import nl.basjes.parse.useragent.UserAgentAnalyzer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class YauaaConfig {

    @Bean
    public UserAgentAnalyzer userAgentAnalyzer() {
        return UserAgentAnalyzer.newBuilder().hideMatcherLoadStats().withCache(10000).build();
    }
}
Code-Sprache: CSS (css)

Mit dieser Konfiguration wird ein UserAgentAnalyzer erstellt, der einen internen Cache für bis zu 10.000 Einträge verwendet.


3. Auslesen des User-Agent-Strings in einem Controller

Um den User-Agent-String eines Requests auszulesen, kann der Wert des User-Agent-Headers genutzt werden. Dies wird in einem Spring-Boot-Controller wie folgt umgesetzt:

import nl.basjes.parse.useragent.UserAgent;
import nl.basjes.parse.useragent.UserAgentAnalyzer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class UserAgentController {

    private final UserAgentAnalyzer userAgentAnalyzer;

    @Autowired
    public UserAgentController(UserAgentAnalyzer userAgentAnalyzer) {
        this.userAgentAnalyzer = userAgentAnalyzer;
    }

    @GetMapping("/user-agent")
    public Map<String, String> parseUserAgent(@RequestHeader(value = "User-Agent", defaultValue = "Unknown") String userAgentHeader) {
        UserAgent userAgent = userAgentAnalyzer.parse(userAgentHeader);

        // Extrahieren einzelner Attribute
        Map<String, String> userAgentDetails = new HashMap<>();
        userAgentDetails.put("Browser", userAgent.getValue("AgentName"));
        userAgentDetails.put("BrowserVersion", userAgent.getValue("AgentVersion"));
        userAgentDetails.put("OS", userAgent.getValue("OperatingSystemName"));
        userAgentDetails.put("OSVersion", userAgent.getValue("OperatingSystemVersion"));
        userAgentDetails.put("DeviceClass", userAgent.getValue("DeviceClass"));

        return userAgentDetails;
    }
}
Code-Sprache: JavaScript (javascript)

Dieser Controller verarbeitet den User-Agent-Header eines HTTP-Requests und gibt die analysierten Details als JSON zurück.


4. Beispielausgabe und Verwendung

Wenn ein Client diesen Endpunkt aufruft, sendet er seinen User-Agent-String mit. Ein Beispielaufruf mit curl könnte so aussehen:

curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.134 Safari/537.36" http://localhost:8080/user-agent
Code-Sprache: JavaScript (javascript)

Die Ausgabe könnte etwa wie folgt aussehen:

{
    "Browser": "Chrome",
    "BrowserVersion": "114.0.5735.134",
    "OS": "Windows",
    "OSVersion": "10.0",
    "DeviceClass": "Desktop"
}
Code-Sprache: JSON / JSON mit Kommentaren (json)

5. Erweiterung: Nutzung in der Anwendung

Die analysierten Daten können in der Anwendung vielfältig verwendet werden:

5.1. Anpassung von Inhalten

Abhängig vom Gerätetyp oder der Browser-Version können Inhalte dynamisch angepasst werden, z. B.:

  • Desktop-Nutzer erhalten eine optimierte Desktop-Oberfläche.
  • Mobile-Nutzer werden auf eine responsive Version umgeleitet.

5.2. Analyse und Monitoring

Die gesammelten Daten können in eine Datenbank geschrieben und zur Erstellung von Statistiken genutzt werden. Dies hilft, die Nutzung der Webanwendung besser zu verstehen und die Zielgruppe zu analysieren.

import org.springframework.web.bind.annotation.PostMapping;

@PostMapping("/log-user-agent")
public void logUserAgent(@RequestHeader(value = "User-Agent") String userAgentHeader) {
    UserAgent userAgent = userAgentAnalyzer.parse(userAgentHeader);

    // Beispiel: Speichern in der Konsole
    System.out.println("Browser: " + userAgent.getValue("AgentName"));
    System.out.println("OS: " + userAgent.getValue("OperatingSystemName"));
}
Code-Sprache: JavaScript (javascript)

5.3. Sicherheitsmaßnahmen

Crawler oder verdächtige User-Agent-Strings können erkannt und blockiert werden. Dies wird oft verwendet, um Bots von geschützten Bereichen fernzuhalten.


6. Fazit

Die Yauaa-Library ist ein einfach zu verwendendes Werkzeug, das in Spring-Boot-Anwendungen mühelos integriert werden kann. Sie ermöglicht eine präzise Analyse von User-Agent-Strings und liefert wertvolle Informationen über die Clients einer Webanwendung. Mit diesen Daten können Entwickler Inhalte gezielt anpassen, Statistiken erstellen oder Sicherheitsmaßnahmen implementieren. Dank der Flexibilität und Performance von Yauaa eignet sich die Library sowohl für kleine Projekte als auch für große, skalierbare Systeme.