Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java根据ip地址获取城市地域信息

java根据ip地址获取城市地域信息

作者头像
码农笔录
发布于 2018-06-29 09:54:54
发布于 2018-06-29 09:54:54
4.4K00
代码可运行
举报
文章被收录于专栏:码农笔录码农笔录
运行总次数:0
代码可运行

java根据ip地址获取城市地域信息

这里提供两个公开的接口,一个是阿里的,一个是新浪的 http://ip.taobao.com/service/getIpInfo.php?ip=123.139.94.139

http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.192.3.42

接下来上代码,我这里用的是springboot自带的RestTemplate,各位如果没用到可以用HttpURLConnection。案例是在拦截器里获取ip,并查询地址。如果内网测试的话,获取到的是内网ip,通过内网穿透出去访问,可以获取你的公网出口ip,或者吧ip直接写死。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootApplication
public class LgmallRestApplication {
    @Autowired
    private RestTemplateBuilder builder;
    @Bean
    public RestTemplate restTemplate() {
        return builder.build();
    }
    public static void main(String[] args) {
        SpringApplication.run(LgmallRestApplication.class, args);
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @Author: nelson
 * @Description: 商品浏览记录拦截器
 * @Date: created in 2018/03/31/16:49
 */
public class BrowseItemInterceptor implements HandlerInterceptor {

    @Autowired
    private RestTemplate restTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ip = request.getHeader("x-forwarded-for");
        if(ip == null || ip.length() == 0 || "unknown".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 != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
            // 多次反向代理后会有多个ip值,第一个ip才是真实ip
            if( ip.indexOf(",")!=-1 ){
                ip = ip.split(",")[0];
            }
        }
        //新浪查询失败查询阿里
        String sina = restTemplate.getForObject("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip={ip}", String.class,ip);
        SinaIpVo sinaIpVo = new Gson().fromJson(sina, SinaIpVo.class);
        if(sinaIpVo.getRet()!=-1){
            System.out.println(sinaIpVo.getProvince());
            System.out.println(sinaIpVo.getCity());
        }else{
            String object = restTemplate.getForObject("http://ip.taobao.com/service/getIpInfo.php?ip={ip}", String.class,ip);
            IpVo ipVo = new Gson().fromJson(object, IpVo.class);
            // XX表示内网 
            if(ipVo.getCode()==0 && !ipVo.getAddress().getRegion().equals("XX")){
                System.out.println(ipVo.getAddress().getRegion());
                System.out.println(ipVo.getAddress().getCity());
            }
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

阿里返回结果封装的vo,省去get、set方法,需要其他的属性根据返回json自己扩展。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @Author: nelson
 * @Description: get city by ip
 * @Date: created in 2018/03/31/17:40
 */
public class IpVo implements Serializable{
    private Integer code;
    private Address address;

    public class Address implements Serializable{
        private String ip;
        private String region;
        private String city;
    }
}

新浪返回结果封装的vo,省去get、set方法,需要其他的属性根据返回json自己扩展。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @Author: nelson
 * @Description: get city by ip
 * @Date: created in 2018/03/31/17:40
 */
public class SinaIpVo implements Serializable{
    private Integer ret;
    private String province;
    private String city;
}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年04月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【转】Python 模块简介 -- argparse
argparse 是 Python 标准库中用来解析命令行参数和选项的模块,其是为替代已经过时的 optparse 模块而生的,该模块在 Python2.7 中被引入。argparse模块的作用是用于解析命令行参数。
marsggbo
2020/03/17
2.7K1
Python3脚本编程常用.md
Python 提供了 getopt 模块来获取命令行参数(指定参数名称) getopt 模块是专门处理命令行参数的模块,用于获取命令行选项和参数,也就是sys.argv,命令行选项使得程序的参数更加灵活,支持短选项模式(-)和长选项模式(–)。
全栈工程师修炼指南
2020/10/23
1.1K0
Python3脚本编程常用.md
python包合集-argparse
  argparse 是 python 自带的命令行参数解析包,可以用来方便的服务命令行参数,使用之前需要先导入包 import argparse
Se7eN_HOU
2022/09/28
4140
python包合集-argparse
Python第六周 学习笔记(3)
可以把数据提出来后,交给IP地址解析库处理 正则的验证只是一个初步的筛选,把明显的错误过滤掉
py3study
2020/01/07
3490
Python 命令行之旅:深入 argparse(二)
在上一篇“深入 argparse (一)”的文章中,我们深入了解了 argparse 的包括参数动作和参数类别在内的基本功能,具备了编写一个简单命令行程序的能力。本文将继续深入了解 argparse 的进阶玩法,一窥探其全貌,助力我们拥有实现复杂命令行程序的能力。
Python猫
2019/10/15
1.4K0
Python argparse标准库快速入门
Python是一门非常好用的脚本语言,自然使用它来开发命令行程序也比较方便。而且Python的标准库中有一个名为argparse的库,可以非常方便的让我们把命令行参数转换成所需的数据格式。下面就让我们来看看如何使用argparse标准库吧。
乐百川
2020/02/18
9600
python学习之argparse模块
argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块。
py3study
2020/01/09
2K0
python 模块argparse用法实
 argparse是python内置模块,用于快速创建命令行。有一个第三方模块Click也可以实现这个功能,两者各有优缺点,看个人需求吧。
py3study
2020/01/10
4900
Python 命令行之旅:初探 argparse
花下猫语:国庆期间,公众号停更了几天,那是因为我去江西参加婚礼了,如今正在写“观感”呢(写完后会发在文艺号“豌豆花”上)。所以,原创文章要再拖一下了。
Python猫
2019/10/14
7070
Python 命令行之旅:初探 argparse
python argparse处理命令行参数
对于脚本编程而言,经常需要从命令行传递参数到脚本中。对于命令行参数的定义和使用,有一套完整的规则,以linux上的ls命令为例
生信修炼手册
2020/05/25
1.6K0
Python 命令行之旅:深入argparse (一)
在第一篇“初探 argparse”的文章中,我们初步掌握了使用 argparse 的四部曲,对它有了一个基本的体感。但是它具体支持哪些类型的参数?这些参数该如何配置?本文将带你深入了解 argparse 的参数。
Python猫
2019/10/14
7380
Python 命令行之旅:深入argparse (一)
Python3 初学实践案例(3)argparse 命令行参数库的使用
FungLeo
2018/01/08
1.6K0
Python3 初学实践案例(3)argparse 命令行参数库的使用
python: argparse库 & 命令行解析工具
API ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest]) name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, –foo。 action - 命令行遇到参数时的动作,默认值是 store。 store_const,表示赋值为con
JNingWei
2018/09/27
7370
Python3 命令行参数解析
在模型训练程序中,我们经常要配置命令参数,这里可用到 argparse 模块,它是 Python 内置的一个用于命令选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息。 使用 argparse 模块解析命令行参数,主要分三个步骤:创建解析器、添加参数、解析参数,步骤如下:
嵌入式视觉
2022/09/05
1.4K0
python-argparse
在python程序中,第一步就是获取参数,然后程序才能执行。对于简单的程序脚本,可以直接使用sys.argv[] 来获取命令行参数,但是应用到大的软件项目中,我们需要更加规范,更加方便而功能强大工具来处理命令行参数,本文主要介绍python标准库argparse的简单使用,详细方法及示例请参考python标准库
零式的天空
2022/03/02
8290
Python 模块:argparse
argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后 argparse 将弄清如何从 sys.argv 解析出那些参数。argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
不可言诉的深渊
2019/07/26
2.6K0
【测试开发】python系列教程:argparse 模块
在命令行程序中,经常需要获取命令行参数。Python内置的sys.argv保存了完整的参数列表,我们可以从中解析出需要的参数:
雷子
2023/08/25
2260
【测试开发】python系列教程:argparse 模块
python3 argparse模块
位置参数就是程序根据该参数出现的位置来确定的 如:[root@openstack_1 /]# ls root/ #其中root/是位置参数
周小董
2019/03/25
8810
python-argparse模块
我们通过控制台 输入 python3 argsparser_demo.py --help,我们可以看到相关说明
搁浅同学
2022/07/21
3360
python-argparse模块
python--配置文件以及ConfigParser使用
在项目中通常我们把超参,魔数等需要配置项写入一个配置文件中,方便配置项调整。python项目中通用的配置文件格式有py.ini,json,yml。本文对这些常用形式的配置进行详细讲解。
languageX
2023/01/03
1.5K0
相关推荐
【转】Python 模块简介 -- argparse
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验