Springboot使用future异步获取ip地址对应的地理位置

2023-11-15

future介绍:

Future代表的是异步执行的结果,意思是当异步执行结束之后,返回的结果将会保存在Future中。 那么我们什么时候会用到Future呢? 一般来说,当我们执行一个长时间运行的任务时,使用Future就可以让我们暂时去处理其他的任务,等长任务执行完毕再返回其结果。

场景:登录时获取用户ip地址,插入登录日志,需要获取用户ip对应的地理位置
接口:

import cn.hutool.core.thread.ThreadUtil;
   @OpLog(title = "无密码登录", businessType = "用户登录")
    @GetMapping(value = "/secret-key/{secretKey}", produces = "application/json;charset=UTF-8")
    public Result<DiskUserSecretKeyLoginResponseDTO> secretKeyLogin(@PathVariable(name = "secretKey") String secretKey,
                                                                    HttpServletRequest request, HttpServletResponse response) throws IOException {

        if (SecurityUtils.getSubject().isAuthenticated()) {
            log.info("重复调用登陆模块");
            return getLoginInfo(request);
        }

        // 验证密钥是否为空
        if (StrUtil.isBlank(secretKey)) {
            return Result.refuse();
        }

        // 异步获取IP实际地理位置信息
        Future<Region> future = ThreadUtil.execAsync(() -> IpUtils.getIpLocationByBtree(ServletUtil.getClientIP(request)));

      ...后文省略
    }

ip工具类iputils:

import cn.hutool.core.lang.Singleton;
import org.lionsoul.ip2region.DataBlock;
import org.lionsoul.ip2region.DbConfig;
import org.lionsoul.ip2region.DbSearcher;
import org.apache.commons.io.IOUtils;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.StrUtil;
    public static Region getIpLocationByBtree(String ip) {
        return getIpLocation(ip, "btreeSearch");
    }
 private static synchronized Region getIpLocation(String ip, String algorithm) {
        String intranetIp = "内网IP";
        if (StrUtil.isBlank(ip)) {
            log.info("The IP address detected is empty...");
            return new Region(intranetIp, intranetIp, intranetIp, intranetIp);
        } else if (isInnerIp(ip)) {
            return new Region(intranetIp, intranetIp, intranetIp, intranetIp);
        } else {
            try {
                DbConfig config = (DbConfig)Singleton.get(DbConfig.class, new Object[0]);
                File tempFile = FileUtil.touch((File)Singleton.get(File.class, new Object[]{"ip2region.db"}));
                InputStream inputStream = IpUtils.class.getClassLoader().getResourceAsStream("data/ip2region.db");
                FileOutputStream out = new FileOutputStream(tempFile);
                Throwable var7 = null;

                try {
                    if (inputStream != null) {
                        IOUtils.copy(inputStream, out);
                    }
                } catch (Throwable var17) {
                    var7 = var17;
                    throw var17;
                } finally {
                    if (out != null) {
                        if (var7 != null) {
                            try {
                                out.close();
                            } catch (Throwable var16) {
                                var7.addSuppressed(var16);
                            }
                        } else {
                            out.close();
                        }
                    }

                }

                DbSearcher dbSearcher = (DbSearcher)Singleton.get(DbSearcher.class, new Object[]{config, tempFile.getPath()});
                Method method = dbSearcher.getClass().getMethod(algorithm, String.class);
                DataBlock dataBlock = (DataBlock)method.invoke(dbSearcher, ip);
                if (dataBlock != null && StrUtil.isNotBlank(dataBlock.getRegion())) {
                    String[] ipData = dataBlock.getRegion().split("\\|");
                    return Region.builder().country(ipData[0]).province(ipData[2]).city(ipData[3]).isp(ipData[4]).build();
                } else {
                    return new Region(intranetIp, intranetIp, intranetIp, intranetIp);
                }
            } catch (Exception var19) {
                var19.printStackTrace();
                return new Region(intranetIp, intranetIp, intranetIp, intranetIp);
            }
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot使用future异步获取ip地址对应的地理位置 的相关文章

随机推荐

  • 使用hbuilderx开发小程序项目遇到的问题

    因为在hbuilderx打开项目 文件结构与开发者工具中打开不一致 例如hbuilderx中只有一个 vue文件 开发者工具中则是四个文件wxml wxss js json分别对应结构 样式 代码逻辑 和组件页面配置 配置组件相关 在hbu
  • C++ 并行编程(thread)---多线程

    C 并行编程 多线程 1 并发与并行 2 进程和线程 2 1 常规解释 2 2 总结 2 3 具体理解 2 4 为什么使用多线程 2 5 进程和线程的区别 3 C 中的多线程 3 1 存储持续性 补充 4 从头文件
  • CSDN竞赛52期总结

    1 题目名称 投篮 小明投篮 罚球线投球可得一分 在三分线内投篮得分可以得到2分 在三分线以外的地方投篮得分可以得到3分 连续投 进得分累计 一旦有一个球没投进则得分清零 重新计算 现给出所有得分记录 清零不计入得分 请你计算一下小明 最多
  • gitlab仓库更换地址后pull、push无效,怎么办?轻松解决;

    你有没有遇到一个情况 公司说自己的git地址发生变化 你觉得没有什么 但是当下班时候 我们要提交代码了 发现push不了了 下边我们就解释一下这个事情 第一 原因 因为原来你的clone地址是老的地址 现在是新的地址 所以发生错误 第二 解
  • 服务器和操作系统怎么看,服务器和操作系统怎么看

    服务器和操作系统怎么看 内容精选 换一换 您需要提前准备好符合条件的镜像文件 并了解操作系统的已知问题 参见已知问题 表1中 文件系统 网络 驱动相关的配置需要在虚拟机内部完成 强烈建议您在原平台的虚拟机实施修改后 再导出镜像文件 当然 您
  • 淘宝联盟(淘客)/京东联盟(京东客)/拼多多(多多客)常用接口整理

    一 淘宝客常用接口整理 1 商品ID高佣转链API 描述 通过商品ID进行高佣链接 生成带优惠券的二合一最高佣金的链接 如该商品没有优惠券 则除了生成二合一链接外 还会生成该商品的淘客链接 同样为最高佣金 接口地址 http open 21
  • steam教育文化传承的必要性

    建构主义认为 学习者需要借助文化知识参与到一个群体当中去学习相关知识和技能 学习的过程离不开文化的参与 而知识的学习和技能的掌握依靠的也不仅仅是学习个体与外在环境之间的相互作用 还需要文化的参与 传统文化传承是文化因素 集体智慧在某一共同体
  • 7.19黄金连续砸盘上涨还会跌吗?空单被套怎么办?

    近期有哪些消息面影响黄金走势 今日黄金多空该如何研判 黄金消息面解析 周三 7月19日 亚市盘中 现货黄金高位震荡 目前交投于1976美元 盎司附近 因隔夜美gu大涨打压避险情绪 但金价仍守住了隔夜大部分涨幅 周二金价强势上涨近30美元 顶
  • Vue的简单使用

    第一个Vue程序 1 导入开发版本Vue js 2 使用简洁的模板语法把数据渲染到页面上 的作用是和下面的数据联系起来 div message div 3 创建Vue实例对象 设置el属性和data属性 var app new Vue el
  • java 验证码识别demo

    pom依赖坐标
  • 1222. 可以攻击国王的皇后

    文章目录 Tag 题目来源 题目解读 解题思路 方法一 从白国王出发 方法二 从黑皇后出发 写在最后 Tag 模拟 数组 题目来源 1222 可以攻击国王的皇后 题目解读 在一个 8 8 8 times 8 8 8 的棋盘上 有若干个
  • elasticsearch 简介和创建索引初步

    简介 ElasticSearch是一个开源的分布式搜索引擎 具备高可靠性 支持非常多的企业级搜索用例 像Solr4一样 是基于Lucene构建的 支持时间时间索引和全文检索 官网 http www elasticsearch org 它对外
  • lssvm实例

    clc clear close all 产生训练样本 xn train1 1 2 200 训练样本 每一列为一个样本 xn train2 1 1 100 dn train1 xn train1 2 xn train2 训练目标 行向量 dn
  • 2022产业区块链年度峰会暨FISCO BCOS五周年生态大会

    作为深圳国际金融科技节系列活动之一 由深圳市地方金融监督管理局指导 微众银行 金链盟主办的 2022产业区块链年度峰会暨FISCO BCOS五周年生态大会 将于2月24日下午 在深圳前海华侨城JW万豪酒店举行 此次大会以 数实相生 链筑可持
  • 垂直广告是什么意思_爆火的广告投放方式,抖音Feed流是什么?

    借势2020年的魔幻 短视频行业发展得如火如荼 年初的集体空闲 带动了各大短视频平台的发展 大量抖音创作者的涌入 也让出圈变得越来越难 为了更快出圈 有效利用流量 DOU 和Feed流应运而生 之前已经跟大家讲过DOU 投放的相关事宜 这期
  • 数据结构(三)- 数据的基本操作—增删查

    数据结构 三 增删查 文章目录 数据结构 三 增删查 前言 一 代码对数据的处理 二 数据处理的基本操作 总结 前言 数据最基本的操作 增删查 一 代码对数据的处理 在上篇文章数据结构 二 时间复杂度与空间复杂度中出现的一个例子 在一个数组
  • ubuntu16.04下如何训练PySOT(四):训练、测试、运行demo、评估

    下载预训练模型 从 Google Drive 下载 将预训练模型复制到 pretrained models 文件夹中 训练 在tools目录下打开终端 输入以下命令 即开始训练 CUDA VISIBLE DEVICES 0 python m
  • Matlab中米粒图像处理,米粒个数和大小计算

    clear clc 读取图片rice png I imread rice png 获取图片的背景 BG imopen I strel disk 15 得到背景均匀的图片 I2 imsubtract I BG 得到二值化的图片 level g
  • OpenStack常用命令搜集 —— 筑梦之路

    之前学习搭建过OpenStack 好久都没有使用了 这里主要搜集下OpenStack的常用命令 温故而知新 OpenStack 搭建记录 筑梦之路 筑梦之路的博客 CSDN博客 查看日志 日志位置 使用devstack方式部署 默认日志路径
  • Springboot使用future异步获取ip地址对应的地理位置

    future介绍 Future代表的是异步执行的结果 意思是当异步执行结束之后 返回的结果将会保存在Future中 那么我们什么时候会用到Future呢 一般来说 当我们执行一个长时间运行的任务时 使用Future就可以让我们暂时去处理其他