Extraer información del navegador del usuario en el servidor de una aplicación web Java

Escrito por el .
java planeta-codigo programacion
Comentarios

Java

En una aplicación web dependiendo de las características del cliente si es de escritorio, móvil u otro dispositivo y tamaño, lenguaje o dependiendo de la ubicación mediante su dirección IP puede servirse diferente contenido adaptado a las propiedades del cliente.

La comprobación desde el navegador se realiza con JavaScript, con la propiedad window.navigator.userAgent se obtienen propiedades básicas del agente del usuario como navegador, versión y plataforma. Con la librería JavaScript Modernizr se obtiene las características que soporta el navegador. Pero el código JavaScript se ejecuta en el cliente y la primera petición de un usuario llega al servidor cuando aún no se ha cargado ninguna página ni código JavaScript, sólo se dispone del agente de usuario, lenguaje preferido y dirección IP con lo que es necesario una librería en el lado de servidor que procese el agente del usuario u otra información que este envíe para actúa en consecuencia.

En la primera petición de un usuario a una aplicación Java con la librería browscap-java es posible procesar el agente del usuario y conocer su navegador y versión, tipo de dispositivo, plataforma y versión. Con esta información la aplicación es capaz adaptar el contenido al cliente, por ejemplo si se trata de una versión antigua de un navegador al que hay que seguir ofreciendo soporte porque algunos usuarios siguen usándolo y para el que hay que devolver un JavaScript especial por no soportar algunas características de navegadores más modernos.

En este ejemplo se hace uso de la librería browscap-java y se imprime en la salida de la aplicación la información que esta proporciona interpretando la cadena del agente del usuario. Se observa que en mi caso uso GNU/Linux, Firefox en la versión 70 de la versión de escritorio. Los navegadores envían una cabecera del protocolo HTTP, User-Agent, en la que incluyen información y la firma del navegador o agente del usuario. En el servidor para recuperar la cabecera basta con utilizar el método HttpServletRequest.getHeader() o usando Spring MVC con la anotación @RequestHeader.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package io.github.picotodtdev.blogbitix.useragent;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.ResponseBody;

import com.blueconic.browscap.Capabilities;
import com.blueconic.browscap.UserAgentParser;
import com.blueconic.browscap.UserAgentService;

@Controller
public class IndexController {

    @Autowired
    private UserAgentParser userAgentParser;

    @GetMapping("/")
    @ResponseBody
    public String index(@RequestHeader("User-Agent") String userAgent) {
        Capabilities capabilities = userAgentParser.parse(userAgent);

        String browser = capabilities.getBrowser();
        String browserType = capabilities.getBrowserType();
        String browserMajorVersion = capabilities.getBrowserMajorVersion();
        String deviceType = capabilities.getDeviceType();
        String platform = capabilities.getPlatform();
        String platformVersion = capabilities.getPlatformVersion();

        return String.format("User-Agent: %s\nBrowser: %s, Type: %s, Version: %s, Device: %s, Platform: %s, PlatformVersion: %s", userAgent, browser, browserType, browserMajorVersion, deviceType, platform, platformVersion);
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
plugins {
    id 'org.springframework.boot' version '2.2.1.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
    id 'application'
}

group = 'io.github.picotodtdev.blogbitix.useragent'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

application {
    mainClassName = 'io.github.picotodtdev.blogbitix.useragent.Main'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.blueconic:browscap-java:1.2.13'
}

Accediendo a la dirección del controlador http://localhost:8080 se obtienen los siguientes resultados dependiendo de con que navegador se acceda, en estos ejemplos con Firefox de escritorio, con Chrome de escritorio, y con Firefox de Android.

1
2
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0
Browser: Firefox, Type: Browser, Version: 70, Device: Desktop, Platform: Linux, PlatformVersion: Unknown
1
2
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36
Browser: Chrome, Type: Browser, Version: 78, Device: Desktop, Platform: Linux, PlatformVersion: Unknown
1
2
User-Agent: Mozilla/5.0 (Android 7.0; Mobile; rv:68.0) Gecko/68.0 Firefox/68.0
Browser: Firefox, Type: Browser, Version: 68, Device: Mobile Phone, Platform: Android, PlatformVersion: 7.0

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradlew run.