首页 > 其他分享 >用户代理使用

用户代理使用

时间:2023-06-09 23:35:59浏览次数:59  
标签:return String ip request 代理 用户 header 使用 UserAgent

简介

UserAgentUtils是Java Web项目中一个非常常用的工具库,用于解析用户浏览器的User-Agent字符串,以获取所访问的设备类型、操作系统类型和版本、浏览器类型和版本等信息。

依赖

        <dependency>
            <groupId>eu.bitwalker</groupId>
            <artifactId>UserAgentUtils</artifactId>
            <version>1.21</version>
        </dependency>

代码

import eu.bitwalker.useragentutils.Browser;
import eu.bitwalker.useragentutils.OperatingSystem;
import eu.bitwalker.useragentutils.UserAgent;
import eu.bitwalker.useragentutils.Version;

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.util.Objects;

/**
 * @ClassName UserAgentUtils
 * @Description 用户代理工具类
 * @Author XinHai.Ma
 * @Date 2023/6/9 22:45
 * @Version 1.0
 */
public class UserAgentUtils {

    /**
     * 获取客户端IP地址
     *
     * @param request
     * @return
     */
    public static String getIpAddress(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknow".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
            if (ip.equals("127.0.0.1")) {
                //根据网卡取本机配置的IP
                InetAddress inet = null;
                try {
                    inet = InetAddress.getLocalHost();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                ip = inet.getHostAddress();
            }
        }
        // 多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
        if (ip != null && ip.length() > 15) {
            if (ip.indexOf(",") > 0) {
                ip = ip.substring(0, ip.indexOf(","));
            }
        }
        return ip;
    }


    /**
     * 获取设备类型
     *
     * @param request
     * @return
     */
    public static String getDeviceType(HttpServletRequest request) {
        String agent = request.getHeader("User-Agent");
        UserAgent userAgent = UserAgent.parseUserAgentString(agent);
        OperatingSystem operatingSystem = userAgent.getOperatingSystem(); // 操作系统信息
        eu.bitwalker.useragentutils.DeviceType deviceType = operatingSystem.getDeviceType(); // 设备类型

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


    /**
     * 获取来访者的浏览器版本
     *
     * @param request
     * @return
     */
    public static String getBrowserInfo(HttpServletRequest request) {
        String browserVersion = null;
        String header = request.getHeader("User-Agent");
        if (header == null || header.equals("")) {
            return "";
        }
        if (header.indexOf("MSIE") > 0) {
            browserVersion = "IE";
        } else if (header.indexOf("Firefox") > 0) {
            browserVersion = "Firefox";
        } else if (header.indexOf("Chrome") > 0) {
            browserVersion = "Chrome";
        } else if (header.indexOf("Safari") > 0) {
            browserVersion = "Safari";
        } else if (header.indexOf("Camino") > 0) {
            browserVersion = "Camino";
        } else if (header.indexOf("Konqueror") > 0) {
            browserVersion = "Konqueror";
        }
        return browserVersion;
    }


    /**
     * 获取发起请求的浏览器名称
     *
     * @param request
     * @return
     */
    public static String getBrowserName(HttpServletRequest request) {
        String header = request.getHeader("User-Agent");
        UserAgent userAgent = UserAgent.parseUserAgentString(header);
        Browser browser = userAgent.getBrowser();
        return Objects.isNull(browser) ? "Unknown" : browser.getName();
    }


    /**
     * 获取发起请求的浏览器版本号
     *
     * @param request
     * @return
     */
    public static String getBrowserVersion(HttpServletRequest request) {
        String header = request.getHeader("User-Agent");
        UserAgent userAgent = UserAgent.parseUserAgentString(header);
        //获取浏览器信息
        Browser browser = userAgent.getBrowser();
        //获取浏览器版本号
        Version version = browser.getVersion(header);
        return Objects.isNull(version) ? "Unknown" : version.getVersion();
    }


    /**
     * 获取发起请求的操作系统名称
     *
     * @param request
     * @return
     */
    public static String getOsName(HttpServletRequest request) {
        String header = request.getHeader("User-Agent");
        UserAgent userAgent = UserAgent.parseUserAgentString(header);
        OperatingSystem operatingSystem = userAgent.getOperatingSystem();
        return Objects.isNull(operatingSystem) ? "Unknown" : operatingSystem.getName();
    }

}

实现效果

 

标签:return,String,ip,request,代理,用户,header,使用,UserAgent
From: https://www.cnblogs.com/mxh-java/p/17470497.html

相关文章

  • Vue——vuex使用、Router使用、localstorage、sessionstorage和cookie
    vuex使用#vuex:状态管理器---》存数据(变量)的地方,所有组件都可以操作在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信<h1>1vuex的使用基本使用(操作state的数据)</h1>......
  • 你以为搞个流水线每天跑,团队就在使用CI/CD实践了?
    在实践中,很多团队对于DevOps流水线没有很透彻的理解,要不就创建一大堆流水线,要不就一个流水线通吃。实际上,流水线的设计和写代码一样,需要基于“业务场景”进行一定的设计编排,特别是很多通过“开源工具”搭建的流水线,更需要如此(商业的一体化平台大部分已经把设计思想融入自己产品里......
  • pandas使用
    importnumpyasnpimportpandasaspd2、导入CSV或者xlsx文件:df=pd.DataFrame(pd.read_csv('name.csv',header=1))df=pd.DataFrame(pd.read_excel('name.xlsx'))或者importpandasaspdfromcollectionsimportnamedtupleItem=namedtuple('Item&......
  • Python使用tkinter的Treeview组件实现表格功能
    fromtkinterimportTk,Scrollbar,Framefromtkinter.ttkimportTreeview#创建tkinter应用程序窗口root=Tk()#设置窗口大小和位置root.geometry('500x300+400+300')#不允许改变窗口大小root.resizable(False,False)#设置窗口标题root.title('通信录管理系统')#使......
  • Python中直接查看对象值和使用print()输出的区别
    直接用代码来描述这个问题的现象:>>>x=r'C:\windows\notepad.exe'>>>x'C:\\windows\\notepad.exe'>>>print(x)C:\windows\notepad.exe>>>x='''Tomsaid,"Let'sgo."'......
  • 005Arch中Docker的基本使用---容器
    外链:Docker-ArchWiki(archlinux.org)Docker容器使用|菜鸟教程(runoob.com)输出Helloworlddockerrun-it--rmarchlinuxbash-c"echohelloworld"各个参数解析:-docker:Docker的二进制执行文件-run:与前面的docker组合来运行一个容器--it:---rm:-......
  • 006Arch中Docker的基本使用---可视化界面(portainer)
    外链:Docker入门到实践(九)docker可视化界面portainer的安装与使用_零碎de記憶的博客-CSDN博客InstallPortainerBEwithDockeronWSL/DockerDesktop-PortainerDocumentation安装portainer查询前10个Portainer镜像dockersearchportainer--limit10拉取Po......
  • 使用Python编写简易定时器
    简单模拟了定时器功能,需要的朋友可以自己改写和扩充功能。importdatetimeimportwinsoundimporttimeimportrandomdefTimer(y,m,d,h,mu,s):'''参数分别为年、月、日、时、分、秒'''stopTime=datetime.datetime(y,m,d,h,mu,s)maxTime=stopTime+......
  • 使用Python寻找黑洞数
     黑洞数是指这样的整数:由这个数字每位上的数字组成的最大数减去每位数字组成的最小数仍然得到这个数自身。例如3位黑洞数是495,因为954-459=495,4位数字是6174,因为7641-1467=6174。本文重点在于内置函数sorted()和reversed()的用法。defmain(n):'''参数n表示数字的位数,例如n=3......
  • Python使用Queue对象实现多线程同步小案例
    queue模块的Queue对象实现了多生产者/多消费者队列,尤其适合需要在多个线程之间进行信息交换的场合,实现了多线程编程所需要的所有锁语义。Queue对象主要实现了put()和get()方法,分别用来往队列尾部追加元素和在队列头部获取并删除元素。这两个方法都允许指定超时时间,其用法分别为put(......