Java获取 User-Agent介绍

目录

一、背景:

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

三、hutool-all工具

3.1 调用方法

 3.2 实例

四、user-agent-utils工具

4.1 GIT地址

4.2 加入dependency

4.3 实例


一、背景:

        根据 HttpServletRequest获取访问设备信息。

        Http 协议请求头中的 User-Agent属性会将客户端设备的信息传递给服务器,这些信息包括客户端操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

二、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 | 谷歌专用,用来追寻使用者问题。 |

三、hutool-all工具

3.1 调用方法

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


    cn.hutool
    hutool-all
    5.8.4

 3.2 实例

@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));
}

四、user-agent-utils工具

4.1 GIT地址

GitHub - HaraldWalker/user-agent-utils: Utilities for processing user-agent strings. Can be used to handle http requests in real-time or to analyze log files.

        可惜的是,已经2018年停止维护了 。如果需要使用该项目,可以自己拉一个分支进行维护。

EOL WARNING
This library has reached end-of-life and will not see regular updates any longer.

Version 1.21 was the last official release in 2018.

Pull request with significant feature changes will not get processed.

If you want to improve this library, fork it and release it yourself.

4.2 加入dependency

        然而客户端设备种类、操作系统及其版本繁多,使得 User-Agent 参数的值也有很多种可能。庆幸的是已经有类库对 User-Agent 的解析做了封装。


        
            eu.bitwalker
            UserAgentUtils
            1.21
        

4.3 实例

        在 java 后端项目中可从 HttpServletRequest 中获取 User-Agent 参数值,再借助 UserAgentUtils 工具可以很方便的进行解析。

public static String getDeviceType() {
       // ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String agentString = ServletUtil.getRequest().getHeader("User-Agent");
        UserAgent userAgent = UserAgent.parseUserAgentString(agentString);
        OperatingSystem operatingSystem = userAgent.getOperatingSystem(); // 操作系统信息
        eu.bitwalker.useragentutils.DeviceType deviceType = operatingSystem.getDeviceType(); // 设备类型

        switch (deviceType) {
            case COMPUTER:
                return "PC";
            case TABLET: {
                if (agentString.contains("Android")) return "Android Pad";
                if (agentString.contains("iOS")) return "iPad";
                return "Unknown";
            }
            case MOBILE: {
                if (agentString.contains("Android")) return "Android";
                if (agentString.contains("iOS")) return "IOS";
                return "Unknown";
            }
            default:
                return "Unknown";
        }

    }

你可能感兴趣的:(SpringBoot,Java,java,servlet,开发语言)