当前位置: 首页 > news >正文

获取客户端请求IP及IP所属城市

添加pom依赖

      <dependency>
            <groupId>org.lionsoul</groupId>
            <artifactId>ip2region</artifactId>
            <version>2.6.5</version>
        </dependency>

public class IpUtil {
    private static Searcher searcher;
    private static final String DEFAULT_UNKNOWN="unknown";
    private static final int IP_MIN_LENGTH=0;
    static{
        try {
            ResponseEntity<byte[]> entity= buildResponseEntity("ip2region.xdb");
            searcher = Searcher.newWithBuffer(entity.getBody());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static String getIpAddress(HttpServletRequest request) {
        String ip = DEFAULT_UNKNOWN;
        try {
            ip = request.getHeader("X-Forwarded-For");
            if (ip == null || ip.length() == IP_MIN_LENGTH || DEFAULT_UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ip == null || ip.length() == IP_MIN_LENGTH || DEFAULT_UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            if (ip == null || ip.length() == IP_MIN_LENGTH || DEFAULT_UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
            }
            if (ip == null || ip.length() == IP_MIN_LENGTH || DEFAULT_UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            }
            if (ip == null || ip.length() == IP_MIN_LENGTH || DEFAULT_UNKNOWN.equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
            // 处理多级代理情况
            if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
                int index = ip.indexOf(",");
                if (index > 0) {
                    return ip.substring(0, index);
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return ip;
    }

    public static String getCityByIp(String ip) {
        if ("127.0.0.1".equals(ip) || ip.startsWith("192.168")) {
            return "局域网";
        }

        if (searcher == null) {
            return "...";
        }
        String region = null;
        String errorMessage = null;
        try {
            region = searcher.search(ip);
        } catch (Exception e) {
            errorMessage = e.getMessage();
            if (errorMessage != null && errorMessage.length() > 256) {
                errorMessage = errorMessage.substring(0, 256);
            }
            e.printStackTrace();
        }
        return region;
    }

    public static ResponseEntity<byte[]> buildResponseEntity(String templateName) throws IOException {
        ClassPathResource classPathResource = new ClassPathResource(templateName);
        String filename = classPathResource.getFilename();
        @Cleanup InputStream inputStream = classPathResource.getInputStream();
        byte[] bytes = FileCopyUtils.copyToByteArray(inputStream);
        // 解决中文乱码问题
        String fileName = new String(filename.getBytes("UTF-8"), "iso-8859-1");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment", fileName);
        return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.CREATED);
    }

    public static void main(String[] args){
        System.out.println("********/"+ getCityByIp("61.154.231.236"));
    }
}

完整代码:https://download.csdn.net/download/paj123456789/88478095

相关文章:

获取客户端请求IP及IP所属城市

添加pom依赖 <dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2region</artifactId> <version>2.6.5</version> </dependency> public class IpUtil { private…...

【洛谷 P1106】删数问题 题解(贪心+字符串)

删数问题 题目描述 键盘输入一个高精度的正整数 N N N&#xff08;不超过 250 250 250 位&#xff09;&#xff0c;去掉其中任意 k k k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 N N N 和 k k k&#xff0c;寻找一种方案使得剩下的数字组成…...

【Python · PyTorch】线性代数 微积分

本文采用Python及PyTorch版本如下&#xff1a; Python&#xff1a;3.9.0 PyTorch&#xff1a;2.0.1cpu 本文为博主自用知识点提纲&#xff0c;无过于具体介绍&#xff0c;详细内容请参考其他文章。 线性代数 & 微积分 1. 线性代数1.1 基础1.1.1 标量1.1.2 向量长度&…...

建模和图表工具:Software Ideas Modeler Crack

用于图表、软件设计和分析的 CASE 工具 Software Ideas Modeler 是一款智能CASE 工具和 图表软件&#xff0c;支持 UML、SysML、ERD、BPMN、ArchiMate、流程图、用户故事、线框图。 提升用户体验和人工智能集成 - Software Ideas Modeler 14.05 最近发布的 14.05 版本带来了一…...

Android开发,车载通讯应用——binder通讯原理解析

Binder简单理解 简单来说&#xff0c;Binder 就是用来Client 端和 Server 端通信的。并且 Client 端和 Server 端 可以在一个进程也可以不在同一个进程&#xff0c;Client 可以向 Server 端发起远程调用&#xff0c;也可以向Server传输数据&#xff08;当作函数参数来传&#…...

[算法]求n!在m进制下末尾有多少个0

参考链接&#xff1a;求n&#xff01;在m进制下末尾0的个数_.!零n,,m-CSDN博客 我们这里和参考链接不同 使用结构体去存储每个因数的信息 然后使用变量index作为索引&#xff0c;其最终值为因数的个数 具体原理&#xff1a; 例子1&#xff1a;求9&#xff01;在10进制下的…...

mysql之用户管理、权限管理、密码管理

用户管理 创建用户create user 杨20.0.0.13 identified by 123; 用户重命名rename user 杨20.0.0.13 to yang20.0.0.13; 删除用户drop user 杨20.0.0.13; 权限管理 查看用户权限show grants for 杨20.0.0.13; 赋予用户权限grant all privileges on *.* to 杨localhost id…...

图情档核心期刊 | 北大核心、CSSCI、CSCD

中文核心期刊要目总览&#xff08;A Guide to the Core Journal of China&#xff0c; 简称北大核心&#xff09;&#xff1a; 主办单位&#xff1a;北京大学图书馆更新频率&#xff1a;北大核心在2008年之前每4年更新研究和编制出版一次&#xff0c;2008年之后&#xff0c;改为…...

Mac上具好用的屏幕录像工具(Omi录屏专家)Screen Recorder By Omi Mac 下载安装详细教程

Omi 录屏专家 是 Mac 上的一款出色的录音工具&#xff0c;它让您能够在Mac电脑上轻松录制和保存高质量音频。这款应用拥有简单直观的操作界面&#xff0c;无论我们水平如何&#xff0c;都可以轻松捕捉录制卓越的音质和录像视频。 该版本的 Omi 安装后可以直接支持最高 4K 60帧…...

牛客网刷题-(8)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...

oracle 重启步骤及踩坑经验

oracle 重启步骤及踩坑经验 标准重启步骤 切换到oracle用户 su - oracle关闭监听 lsnrctl stop杀掉oracle有关进程 ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCALNO|awk {print $2}|xargs kill -9#查询pid ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCALNO|awk {p…...

处理mysql数据量大查询缓慢问题(最少百万才有差别)

我建了两个表&#xff0c;一个售后单表&#xff0c;一个售后商品明细表&#xff0c;都是五十个字段。 select * FROM (select id, as_id, as_date, outer_as_id, so_id, type, created, modified, status, status_name, shop_status, shop_status_name, remark, question_type,…...

element-plus走马灯不显示

问题描述 依赖正确&#xff0c;代码用法正确&#xff0c;但是element-plu走马灯就是不显示&#xff01;&#xff01; <div class"content"><el-carousel height"150px" width"200px"><el-carousel-item v-for"item in 4&qu…...

【精】UML及软件管理工具汇总

目录 1 老七工具&#xff08;规划质量&#xff09; 1.1 因果图&#xff08;鱼骨图、石川图&#xff09; 1.2 控制图 1.3 流程图:也称过程图 1.4 核查表:又称计数表 1.5 直方图 1.6 帕累托图 1.7 散点图&#xf…...

【uniapp+vue3】scroll-view实现纵向自动滚动及swiper实现纵向自动滚动

scroll-view本身不支持自动滚动&#xff0c;通过scroll-top属性控制滚动&#xff0c;但是不可以循环滚动 <scroll-view class"notice-bar" scroll-y"true" ref"scrollViewRef" :scroll-top"data.scrollViewTop"scroll-with-animati…...

this.refs[‘tagInput‘].refs.input.focus()和this.$refs[‘tagInput‘].focus()区别

this.$refs[tagInput].$refs.input.focus()和this.$refs[tagInput].focus()两者之间的选择取决于你的组件结构和如何访问DOM元素。 1.this.$refs[tagInput].$refs.input.focus(): 2.这种语法假设你的this.$refs[tagInput]是一个组件实例&#xff0c;并且这个组件实例有一个名为…...

电脑硬件坏了,如何维修?

在电子设备日益普及的今天&#xff0c;电脑已成为很多人生活和工作中不可或缺的工具&#xff0c;然而在使用过程中很容易遇见电脑故障之类的问题&#xff0c;这些问题十有八九来自硬件&#xff0c;那么针对电脑硬件问题&#xff0c;该如何维修&#xff1f; 一般来说&#xff0c…...

elementplus日期时间选择器组件显示很窄

问题描述 似乎是elementplus原生组件的宽度是和父组件相关的 只要父组件很窄就会让弹窗也很窄&#xff0c;但其实两者的宽度不必有这种限制 解决思路 打开控制条查看元素位置以及css样式的class名 发现类名为el-picker-panel__body 尝试重构 css内写样式 .el-picker-pane…...

第三方软件测评选择远程测试好还是现场测试好?

如今许多软件企业在软件开发过程完成之后&#xff0c;会将软件测试工作交由第三方软件测评机构来进行&#xff0c;那么做第三方软件测试时&#xff0c;远程测试和现场测试哪个更好呢?我想这是许多软件企业都十分关注的问题&#xff0c;今天卓码软件测评小编将对以上问题作出简…...

HTTPS协议:保障网络安全的加密通信协议

在当今数字化时代&#xff0c;网络安全问题备受关注。为了保护用户的隐私和数据安全&#xff0c;HTTPS协议应运而生。本文将介绍HTTPS协议的定义、工作原理以及其在网络通信中的重要性。 一、HTTPS协议的定义 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;…...

res-downloader:智能资源捕获工具的技术实现与高效工作流指南

res-downloader&#xff1a;智能资源捕获工具的技术实现与高效工作流指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 资源…...

从键盘敲击到屏幕显示:一个字符在Linux内核里的完整旅程(附C代码模拟)

从键盘敲击到屏幕显示&#xff1a;一个字符在Linux内核里的完整旅程 当你在终端敲下字母"A"时&#xff0c;这个简单的动作背后隐藏着一场跨越硬件、内核和用户空间的精密协作。让我们跟随这个字符的脚步&#xff0c;揭开Linux系统如何处理键盘输入的神秘面纱。 1. …...

一键搭建AI对话系统:通义千问1.5-1.8B-Chat-GPTQ-Int4镜像使用指南

一键搭建AI对话系统&#xff1a;通义千问1.5-1.8B-Chat-GPTQ-Int4镜像使用指南 想快速拥有一个属于自己的AI对话助手吗&#xff1f;今天要介绍的这个方法&#xff0c;可能比你想象中简单得多。不用折腾复杂的模型下载&#xff0c;不用配置繁琐的运行环境&#xff0c;更不用写一…...

深入解析C++中获取进程模块基址的高效实现方法

1. 为什么需要获取进程模块基址 在Windows系统编程中&#xff0c;获取进程模块基址是一个基础但极其重要的操作。简单来说&#xff0c;模块基址就是某个DLL或EXE文件被加载到内存中的起始地址。这个地址就像是模块在内存中的"门牌号"&#xff0c;有了它我们才能找到模…...

从云端到指尖:巧用Aspose组件实现Office/PDF文档秒级HTML预览,攻克移动端大文件访问瓶颈

1. 移动端大文件预览的痛点与解决思路 最近接手一个企业级项目时&#xff0c;遇到了一个非常典型的场景&#xff1a;用户通过PC端上传各种办公文档&#xff08;Word、Excel、PPT、PDF&#xff09;&#xff0c;需要在移动端随时查看。但当文件体积较大时&#xff08;比如超过50M…...

ReplaceItems.jsx:基于智能匹配引擎的Illustrator对象替换解决方案

ReplaceItems.jsx&#xff1a;基于智能匹配引擎的Illustrator对象替换解决方案 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 副标题&#xff1a;面向专业设计师的批量元素管理工具…...

MyBatis批量更新避坑指南:从`<foreach>`拼接SQL到`allowMultiQueries`配置的完整流程

MyBatis批量更新实战&#xff1a;从基础实现到性能调优全解析 批量更新操作是后端开发中绕不开的高频需求&#xff0c;但很多开发者在初次接触MyBatis批量更新时&#xff0c;往往会陷入各种"坑"中。本文将带你系统掌握两种主流实现方案&#xff0c;从基础用法到性能优…...

Graphormer企业级应用:制药公司分子筛选流水线中的轻量部署实践

Graphormer企业级应用&#xff1a;制药公司分子筛选流水线中的轻量部署实践 1. 项目背景与价值 在药物研发领域&#xff0c;分子筛选是耗时耗力的关键环节。传统实验方法需要数月时间才能完成数千种化合物的性质测试&#xff0c;而基于AI的分子属性预测技术可以将这一过程缩短…...

3天掌握MediaPipe:从零开始构建实时AI应用的终极指南

3天掌握MediaPipe&#xff1a;从零开始构建实时AI应用的终极指南 【免费下载链接】mediapipe Cross-platform, customizable ML solutions for live and streaming media. 项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe 想快速上手实时AI应用开发却不知…...

[模电]从PN结到实用电路:二极管的深度解析与设计指南

1. PN结&#xff1a;二极管的物理基础 想象一下把一块P型半导体和N型半导体紧密贴合在一起&#xff0c;就像把两块不同颜色的橡皮泥揉捏在一起。P型半导体里充满了带正电的"空穴"&#xff08;可以理解为缺少电子的位置&#xff09;&#xff0c;而N型半导体则富含自由…...