Java获取客户端操作系统类型-HTTP请求头User-Agent

简介: 项目部署之后,通过代码获取的系统参数均为服务端的系统环境,并不能直接获取到客户端的系统参数。因此需要利用**HttpServletRequest**获取到请求头,其中**User-Agent**包含了浏览器信息,并且可以获取到操作系统的相关信息。

一、简述

项目部署之后,通过代码获取的系统参数均为服务端的系统环境,并不能直接获取到客户端的系统参数。因此需要利用HttpServletRequest获取到请求头,其中User-Agent包含了浏览器信息,并且可以获取到操作系统的相关信息。

首先,为了操作简单使用了Hutool工具包,里面有很多集成得到工具类,方便可开发时的代码量。其中,就有解析User-Agent的方法,类似的工具有很多,不喜欢引入的可以不引用,自己写也是一样的。

系统 描述
Windows Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
Linux Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 UOS
Android Mozilla/5.0 (Linux; Android) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.109 Safari/537.36 CrKey/1.54.248666
iPhone Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53

二、HTTP请求头和响应头注解

参数名 描述
Get GET请求,GET后面的/代表路径 ?代表参数,HTTP/1.1代表HTTP的版本。传输数据在路径后面。
Post POST请求,POST后面的/代表路径,HTTP/1.1代表HTTP的版本。传输数据在请求头后面。
Host 访问的URL。
Cache-Control 缓存控制是否开启缓存。
User-Agent 用户浏览器信息。
Accept 浏览器能够接受的内容消息。
Accept-Encoding 浏览器发给服务器,声明浏览器支持的编码类型。
Accept-Language 浏览器所支持的语言类型。
Connection 是否开启长链接。close为不长连接,keep-alive保持长连接。
Content-Type ,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这个消息主体中包含一个HTML文档。
Content-Length 消息实体的长度,用于消息的分包和粘包处理。
Content-Encoding 服务端发从过来的body的格式。
Sec-Fetch-Site 请求发起者的来源与目标资源来源之间的关系。
Sec-Fetch-Mode 该请求头表明了一个请求的模式。
Sec-Fetch-User 取值是一个Bool类型的值,用户是主动还是被动请求,ture是主动,false被动。
Sec-Fetch-Dest 表示请求的目的地,即如何使用获取的数据。
sec-ch-ua 可以理解用来替代user-agent的,用sec-ch-ua可以防止泄露浏览器详细信息。
sec-ch-ua-mobile 是否是移动端用户。
sec-ch-ua-platform 表示操作系统名称。
Upgrade-Insecure-Requests 请求头向服务器发送一个客户端对HTTPS加密和认证响应良好,在https页面中,如果调用了http资源,那么浏览器就会抛出一些错误。为了改变成这一状况,chrome(谷歌浏览器)会在http请求中加入 'Upgrade-Insecure-Requests: 1' ,服务器收到请求后会返回 "Content-Security-Policy: upgrade-insecure-requests" 头,告诉浏览器,可以把所属本站的所有 http 连接升级为 https 连接。
Cookie 就是一段字符串,是浏览器保存服务器返回数据的方法,通常保存用户身份信息。
If-None-Macth 服务器接收到附带条件的请求后,只有判断指定条件为假时,才会执行请求。与 If-Match 字段的作用相反。
Pragma 消息头指示浏览器不要将响应保存在缓存中,后来用 Cache-Control 替代。
Authorization 桌面应用程序也通过HTTP协议跟Web服务器交互, 桌面应用程序一般不会使用cookie, 而是把 "用户名+冒号+密码"用BASE64算法加密后的字符串放在http request 中的header Authorization中发送给服务端, 这种方式叫HTTP基本认证(Basic Authentication)。
X-Requested-With 用于判断客户端请求是那种请求。

| referrer | 是HTTP请求header的报文头,用于指明当前流量的来源参考页面。通过这个信息,我们可以知道访客是怎么来到当前页面的。 |
| X-Client-Data | 谷歌专用,用来追寻使用者问题。 |

三、代码

1、调用方法

User-Agent中包含很多信息,一下直接打印,根据需要可以自己进行选择。若是获取系统类型,直接执行ua.getPlatform().toString()即可。

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.4</version>
</dependency>
@GetMapping("print")
public void toPrint(HttpServletRequest requeste){
    System.out.println("--------------------------服务端信息-----------------------------");
    SystemUtil.dumpSystemInfo();
    System.out.println("--------------------------客户端信息-----------------------------");
    UserAgent ua = UserAgentUtil.parse(request.getHeader(Header.USER_AGENT.toString()));
    System.out.println(ua.getPlatform().toString());
    System.out.println(JSONUtil.toJsonStr(ua));
}

2、辅助代码

以下代码不影响获取系统参数,只是添加了一些帮助功能,方便实用而已。

读取请求头信息

public Map<String, String> getHeadersInfo(HttpServletRequest request) {
        Map<String, String> map = new HashMap<String, String>();
        Enumeration headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String key = (String) headerNames.nextElement();
            String value = request.getHeader(key);
            map.put(key, value);
        }
        return map;
    }

操作系统类型工具类

下边我添加了判断客户端操作系统的接口,只有PC端。但是判断移动端的方法Hutool工具包UserAgent已经有了。

import cn.hutool.core.collection.CollUtil;

import java.util.List;

/**
 * 操作系统类型
 */
public class OSType {
    
    public static final String Windows = "Windows";
    public static final String Linux = "Linux";
    /**
     * OSX(Mac OSX)是美国苹果公司于2013年公布的OS X操作系统
     */
    public static final String OSX = "OSX";
    public static final String Mac = "Mac";
    public static final String Unix = "Unix";
    public static final String Android = "Android";
    /**
     * Wii是任天堂公司2006年11月19日推出的家用游戏机
     */
    public static final String Wii = "Wii";
    public static final String PS3 = "PS3";
    public static final String PSP = "PSP";
    public static final String iPod = "iPod";
    public static final String iPad = "iPad";
    public static final String iPhone = "iPhone";
    public static final String YPod = "YPod";
    public static final String YPad = "YPad";
    public static final String YPhone = "YPhone";
    public static final String Symbian = "Symbian";
    public static final String Darwin = "Darwin";
    public static final String Adobe_Air = "Adobe Air";
    public static final String Java = "Java";
    public static final String GoogleTV = "GoogleTV";
    public static final String Windows_Phone = "Windows Phone";

    /**
     * Linux系统,主要分debian系和redhat系,还有其它自由的发布版本。
     */
    public static final List<String> linuxs = CollUtil.newArrayList("Debian","Ubuntu","Mint","RedHat","Fedora","CentOs","Slackware","Gentoo","Arch linux","LFS","SUSE");

    /**
     * Windows系统,主要的发布版本。
     */
    public static final List<String> windows = CollUtil.newArrayList("Windows 11","Windows 10","Windows 8.1","Windows 8","Windows 7","Windows 2003","Windows 2000","Windows 98","Windows Vista","Windows XP","Windows Server 2008R2","Windows Server 2012","Windows Server 2012R2","Windows Server 2016");

    /**
     * 移动平台类型
     */
    public static final List<String> mobiles = CollUtil.newArrayList(Android,Windows_Phone,iPod,iPad,iPhone,GoogleTV,"htcFlyer","Symbian","Blackberry");

    /**
     * 客户端系统是否为Windows --> 系统为Windows或主要的发布版本
     * @param os Windows
     * @return
     */
    public static boolean isWindows(String os){
        return (OSType.Windows.equals(os) || windows.contains(os)) ? true : false;
    }

    /**
     * 客户端系统是否为Linux --> 系统为Linux或各发布版本
     * debian系:Debian,Ubuntu,Mint,
     * redhat系:RedHat,Fedora,CentOs
     * 其它自由的发布版本:Slackware,Gentoo,Arch linux,LFS,SUSE
     * @param os Linux
     * @return
     */
    public static boolean isLinux(String os){
        return (OSType.Linux.equals(os) || linuxs.contains(os)) ? true : false;
    }

}

效果

--------------------------服务端信息-----------------------------
--------------
JavaVM Spec. Name:    Java Virtual Machine Specification
JavaVM Spec. Version: 1.8
JavaVM Spec. Vendor:  Oracle Corporation

--------------
JavaVM Name:    Java HotSpot(TM) 64-Bit Server VM
JavaVM Version: 25.311-b11
JavaVM Vendor:  Oracle Corporation
JavaVM Info:    mixed mode

--------------
Java Spec. Name:    Java Platform API Specification
Java Spec. Version: 1.8
Java Spec. Vendor:  Oracle Corporation

--------------
Java Version:    1.8.0_311
Java Vendor:     Oracle Corporation
Java Vendor URL: http://java.oracle.com/

--------------
Java Runtime Name:      Java(TM) SE Runtime Environment
Java Runtime Version:   1.8.0_311-b11
Java Home Dir:          C:\Program Files\Java\jdk1.8.0_311\jre
Java Extension Dirs:    C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
Java Endorsed Dirs:     C:\Program Files\Java\jdk1.8.0_311\jre\lib\endorsed
Java Class Path:        C:\Program Files\Java\jdk1.8.0_311\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_311\jre\lib\rt.jar;D:\Data\Code\IdeaProjects\TestBootDemo\target\classes;D:\Data\Repository\maven\org\springframework\boot\spring-boot-starter-web\2.7.0\spring-boot-starter-web-2.7.0.jar;D:\Data\Repository\maven\org\springframework\boot\spring-boot-starter\2.7.0\spring-boot-starter-2.7.0.jar;D:\Data\Repository\maven\org\springframework\boot\spring-boot-starter-logging\2.7.0\spring-boot-starter-logging-2.7.0.jar;D:\Data\Repository\maven\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;D:\Data\Repository\maven\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;D:\Data\Repository\maven\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;D:\Data\Repository\maven\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;D:\Data\Repository\maven\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;D:\Data\Repository\maven\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\Data\Repository\maven\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;D:\Data\Repository\maven\org\springframework\boot\spring-boot-starter-json\2.7.0\spring-boot-starter-json-2.7.0.jar;D:\Data\Repository\maven\com\fasterxml\jackson\core\jackson-databind\2.13.3\jackson-databind-2.13.3.jar;D:\Data\Repository\maven\com\fasterxml\jackson\core\jackson-annotations\2.13.3\jackson-annotations-2.13.3.jar;D:\Data\Repository\maven\com\fasterxml\jackson\core\jackson-core\2.13.3\jackson-core-2.13.3.jar;D:\Data\Repository\maven\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.3\jackson-datatype-jdk8-2.13.3.jar;D:\Data\Repository\maven\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.3\jackson-datatype-jsr310-2.13.3.jar;D:\Data\Repository\maven\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.3\jackson-module-parameter-names-2.13.3.jar;D:\Data\Repository\maven\org\springframework\boot\spring-boot-starter-tomcat\2.7.0\spring-boot-starter-tomcat-2.7.0.jar;D:\Data\Repository\maven\org\apache\tomcat\embed\tomcat-embed-core\9.0.63\tomcat-embed-core-9.0.63.jar;D:\Data\Repository\maven\org\apache\tomcat\embed\tomcat-embed-el\9.0.63\tomcat-embed-el-9.0.63.jar;D:\Data\Repository\maven\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.63\tomcat-embed-websocket-9.0.63.jar;D:\Data\Repository\maven\org\springframework\spring-web\5.3.20\spring-web-5.3.20.jar;D:\Data\Repository\maven\org\springframework\spring-beans\5.3.20\spring-beans-5.3.20.jar;D:\Data\Repository\maven\org\springframework\spring-webmvc\5.3.20\spring-webmvc-5.3.20.jar;D:\Data\Repository\maven\org\springframework\spring-aop\5.3.20\spring-aop-5.3.20.jar;D:\Data\Repository\maven\org\springframework\spring-context\5.3.20\spring-context-5.3.20.jar;D:\Data\Repository\maven\org\springframework\spring-expression\5.3.20\spring-expression-5.3.20.jar;D:\Data\Repository\maven\org\springframework\boot\spring-boot-devtools\2.7.0\spring-boot-devtools-2.7.0.jar;D:\Data\Repository\maven\org\springframework\boot\spring-boot\2.7.0\spring-boot-2.7.0.jar;D:\Data\Repository\maven\org\springframework\boot\spring-boot-autoconfigure\2.7.0\spring-boot-autoconfigure-2.7.0.jar;D:\Data\Repository\maven\org\projectlombok\lombok\1.18.24\lombok-1.18.24.jar;D:\Data\Repository\maven\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;D:\Data\Repository\maven\org\springframework\spring-core\5.3.20\spring-core-5.3.20.jar;D:\Data\Repository\maven\org\springframework\spring-jcl\5.3.20\spring-jcl-5.3.20.jar;D:\Data\Repository\maven\cn\hutool\hutool-all\5.8.3\hutool-all-5.8.3.jar;D:\Soft\JetBrains\IntelliJ IDEA 2021.2\lib\idea_rt.jar;C:\Users\ZhiPengyu\AppData\Local\JetBrains\IntelliJIdea2021.2\captureAgent\debugger-agent.jar
Java Class Version:     52.0
Java Library Path:      C:\Program Files\Java\jdk1.8.0_311\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;D:\Soft\oraclexe\app\oracle\product\11.2.0\server\bin;;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Java\jdk1.8.0_311\bin;C:\Program Files\Java\jdk1.8.0_311\jre\bin;D:\Runtimes\apache-maven-3.8.4\bin;D:\Soft\TortoiseSVN\bin;D:\Soft\nodejs\;D:\Soft\Git\cmd;C:\Program Files\TortoiseGit\bin;D:\Runtimes\gradle-7.3.3\bin;D:\Soft\NetSarang\Xftp 7\;D:\Soft\NetSarang\Xshell 7\;C:\Users\ZhiPengyu\AppData\Local\Microsoft\WindowsApps;;D:\Soft\JetBrains\IntelliJ IDEA 2021.2\bin;;C:\Users\ZhiPengyu\AppData\Roaming\npm;.
Java Protocol Packages: [n/a]

--------------
OS Arch:        amd64
OS Name:        Windows 10
OS Version:     10.0
File Separator: \
Line Separator: 

Path Separator: ;

--------------
User Name:        xxxxxxxx\
User Home Dir:    C:\Users\xxxxxxx\
User Current Dir: D:\Data\Code\IdeaProjects\TestBootDemo\
User Temp Dir:    C:\Users\xxxxxx~1\AppData\Local\Temp\
User Language:    zh
User Country:     CN

--------------
Host Name:    DESKTOP-F32HOFJ
Host Address: xxxxxxxx

--------------
Max Memory:    6.93 GB
Total Memory:     467.5 MB
Free Memory:     445 MB
Usable Memory:     6.91 GB

--------------
--------------------------客户端信息-----------------------------
Windows
{"mobile":false,"browser":{"name":"Chrome","pattern":"chrome"},"version":"103.0.0.0","platform":{"name":"Windows","pattern":"windows"},"os":{"name":"Windows 10 or Windows Server 2016","pattern":"windows nt 10\\.0"},"osVersion":"10.0","engine":{"name":"Webkit","pattern":"webkit"},"engineVersion":"537.36"}
目录
相关文章
|
16天前
|
Windows
Windows操作系统部署安装Kerberos客户端
详细介绍了在Windows操作系统上部署安装Kerberos客户端的完整过程,包括下载安装包、安装步骤、自定义安装路径、修改环境变量、配置hosts文件和Kerberos配置文件,以及安装后的验证步骤。
30 3
Windows操作系统部署安装Kerberos客户端
|
20天前
|
消息中间件 算法 Java
深入浅出操作系统:进程管理的艺术掌握Java中的异常处理机制
【8月更文挑战第30天】在数字世界的舞台上,操作系统扮演着导演的角色,精心安排着每一个进程的表演。本文将揭开进程管理的神秘面纱,从进程的诞生到终结,探究它们如何在操作系统的指挥下和谐共舞。通过生动的比喻和直观的代码示例,我们将一同走进操作系统的核心,理解进程调度、同步与通信的内在机制,以及它们对计算生态的重要性。让我们跟随代码的节奏,一起感受操作系统的魅力吧!
|
1月前
|
开发者 Python
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
67 1
|
2月前
|
Java 关系型数据库 MySQL
GraalVM 静态编译下 OTel Java Agent 的自动增强方案与实现
在 2024 OpenTelemetry Community Day 会议中,阿里云可观测工程师张乎兴(望陶)和饶子昊(铖朴)为大家带来了《GraalVM 静态编译下 OTel Java Agent 的自动增强方案与实现》的演讲分享,介绍阿里云在相关领域的探索方案,本文是相关分享对应的中文整理。
229 12
|
22天前
|
存储 安全 Java
深入理解操作系统:从用户空间到内核空间的旅程深入浅出Java异常处理机制
【8月更文挑战第28天】在数字世界的海洋中,操作系统是承载软件与硬件沟通的巨轮。本文将揭开操作系统神秘的面纱,通过一次思维的航行,带领读者从应用程序的用户空间出发,穿越系统调用的大门,深入内核空间的心脏。我们将探索进程管理、内存分配、文件系统等核心概念,并借助代码示例,揭示操作系统背后的魔法。准备好了吗?让我们启航,去发现那些隐藏在日常计算活动背后的秘密。 【8月更文挑战第28天】在Java编程世界中,异常处理就像是我们生活中的急救包。它不仅保护程序不因意外而崩溃,还确保了代码的健壮性和可靠性。本文将通过简洁明了的语言和生动的比喻,带你了解Java异常处理的奥秘,从基本的try-catch语
|
25天前
【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)
【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)
|
26天前
|
数据采集 人工智能 监控
【Azure 应用程序见解】Application Insights Java Agent 3.1.0的使用实验,通过修改单个URL的采样率来减少请求及依赖项的数据采集
【Azure 应用程序见解】Application Insights Java Agent 3.1.0的使用实验,通过修改单个URL的采样率来减少请求及依赖项的数据采集
|
2月前
|
Go 开发者
golang的http客户端封装
golang的http客户端封装
30 0
|
3月前
|
JSON 数据格式 Python
Python 的 requests 库是一个强大的 HTTP 客户端库,用于发送各种类型的 HTTP 请求
【6月更文挑战第15天】Python的requests库简化了HTTP请求。安装后,使用`requests.get()`发送GET请求,检查`status_code`为200表示成功。类似地,`requests.post()`用于POST请求,需提供JSON数据和`Content-Type`头。
50 6
|
3月前
|
IDE Oracle Java
Java 是一种跨平台的编程语言,可以在各种操作系统上运行。
Java 是一种跨平台的编程语言,可以在各种操作系统上运行。