一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Java利用Request請求如何獲取IP地址對應的省份、城市詳解

Java利用Request請求如何獲取IP地址對應的省份、城市詳解

2021-01-27 11:03大大的微笑 JAVA教程

之前已經給大家介紹了關于Java用Request請求獲取IP地址的相關內容,那么下面這篇文章將給大家進入深入的介紹,關于Java利用Request請求如何獲取IP地址對應省份、城市的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

最近的一個項目中需要將不同省份的用戶,展示不同內容,所以需要通過Request請求獲取IP地址, 然后通過IP獲取IP對應省份。

這里的操作步驟一共有步:

      1. 通過Request獲取IP

      2. 通過IP獲取對應省份、城市

      3. 通過設置的省份和IP對應省份進行比對,展示內容

通過Request獲取IP

可以參考我的另外一篇文章【Java 通過Request請求獲取IP地址】下面是代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class IpAdrressUtil {
 /**
 * 獲取Ip地址
 * @param request
 * @return
 */
 private static String getIpAdrress(HttpServletRequest request) {
 String Xip = request.getHeader("X-Real-IP");
 String XFor = request.getHeader("X-Forwarded-For");
 if(StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
 //多次反向代理后會有多個ip值,第一個ip才是真實ip
 int index = XFor.indexOf(",");
 if(index != -1){
 return XFor.substring(0,index);
 }else{
 return XFor;
 }
 }
 XFor = Xip;
 if(StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
 return XFor;
 }
 if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
 XFor = request.getHeader("Proxy-Client-IP");
 }
 if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
 XFor = request.getHeader("WL-Proxy-Client-IP");
 }
 if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
 XFor = request.getHeader("HTTP_CLIENT_IP");
 }
 if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
 XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
 }
 if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
 XFor = request.getRemoteAddr();
 }
 return XFor;
 }
}

通過IP獲取對應省份、城市

使用【GeoLite2 City】庫

目前開源的IP地址庫與城市對應關系用的比較多的是MaxMind公司的GeoLite數據庫,GeoLite數據庫有開源版本和收費版本,我們使用的是開源版本,GeoLite目前已經更新到2了,所以我們下載GeoLite2 City庫。

官方下載地址是【http://dev.maxmind.com/geoip/geoip2/geolite2/

Java利用Request請求如何獲取IP地址對應的省份、城市詳解

如果覺得慢就用迅雷下。下載完成后就是,下載完成就解壓。得到【GeoLite2-City.mmdb】文件,這個就是數據庫。

Java利用Request請求如何獲取IP地址對應的省份、城市詳解

Java例子是這樣使用的:

首先在項目中加入maven支持

?
1
2
3
4
5
<dependency>
<groupId>com.maxmind.geoip2</groupId>
<artifactId>geoip2</artifactId>
<version>2.8.1</version>
</dependency>

然后通過GeoLite2查詢得到省份、城市:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public static void main(String[] args) throws Exception{
 // 創建 GeoLite2 數據庫
 File database = new File("/Users/admin/GeoLite2-City.mmdb");
 // 讀取數據庫內容
 DatabaseReader reader = new DatabaseReader.Builder(database).build();
 InetAddress ipAddress = InetAddress.getByName("171.108.233.157");
 
 // 獲取查詢結果
 CityResponse response = reader.city(ipAddress);
 
 // 獲取國家信息
 Country country = response.getCountry();
 System.out.println(country.getIsoCode()); // 'CN'
 System.out.println(country.getName()); // 'China'
 System.out.println(country.getNames().get("zh-CN")); // '中國'
 
 // 獲取省份
 Subdivision subdivision = response.getMostSpecificSubdivision();
 System.out.println(subdivision.getName()); // 'Guangxi Zhuangzu Zizhiqu'
 System.out.println(subdivision.getIsoCode()); // '45'
 System.out.println(subdivision.getNames().get("zh-CN")); // '廣西壯族自治區'
 
 // 獲取城市
 City city = response.getCity();
 System.out.println(city.getName()); // 'Nanning'
 Postal postal = response.getPostal();
 System.out.println(postal.getCode()); // 'null'
 System.out.println(city.getNames().get("zh-CN")); // '南寧'
 Location location = response.getLocation();
 System.out.println(location.getLatitude()); // 22.8167
 System.out.println(location.getLongitude()); // 108.3167
 
}

如果是生產環境,可以直接創建一個Service,在Service初始化的時候創建reader對象,然后在公共方法中通過ip查詢地址,下面以省份為例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import com.maxmind.geoip2.DatabaseReader;
import com.maxmind.geoip2.model.CityResponse;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
 
import javax.annotation.PostConstruct;
import java.io.File;
import java.net.InetAddress;
 
/**
 * IP地址服務
 */
@Service
public class IpAddressService {
 
 private static Logger logger = LoggerFactory.getLogger(IpAddressService.class);
 
 private static String dbPath = "/usr/local/GeoLite2-City.mmdb";
 
 private static DatabaseReader reader;
 
 @Autowired
 private Environment env;
 
 @PostConstruct
 public void init() {
 try {
 String path = env.getProperty("geolite2.city.db.path");
 if (StringUtils.isNotBlank(path)) {
 dbPath = path;
 }
 File database = new File(dbPath);
 reader = new DatabaseReader.Builder(database).build();
 } catch (Exception e) {
 logger.error("IP地址服務初始化異常:" + e.getMessage(), e);
 }
 }
 
 
 public String getSubdivision(String ipAddress){
 try {
 CityResponse response = reader.city(InetAddress.getByName(ipAddress));
 return response.getMostSpecificSubdivision().getNames().get("zh-CN");
 }catch (Exception e){
 logger.error("根據IP[{}]獲取省份失敗:{}", ipAddress, e.getMessage());
 return null;
 }
 }
}

然后在需要的地方就行判斷:

?
1
2
3
4
5
6
String areaNames = {"北京","天津","上海"};
String subdivision = ipAddressService.getSubdivision(getIpAdrress(request));
 // 匹配
 if(containsArea(subdivision, areaNames)){
 // 處理...
 }

匹配方法:

?
1
2
3
4
5
6
7
8
9
10
11
private boolean containsArea(String name, String[] areaNames) {
if(StringUtils.isBlank(name)){
return false;
}
for(String areaName : areaNames){
if(name.contains(areaName)){
return true;
}
}
return false; // 按地域返回數據
}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://blog.csdn.net/chwshuang/article/details/71951000

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2018天天拍拍拍免费视频 | 美国复古性经典xxxxx | 天天夜夜草草久久伊人天堂 | 午夜精品久久久久久久99蜜桃i | 单身男女韩剧在线看 | 456亚洲老头视频 | 视频二区 素人 制服 国产 | 日本孕妇与黑人xxxxxx | 天海翼黄色三级 | 好吊色永久免费视频大全 | 91精品国产色综合久久不卡蜜 | 波多野结衣之双方调教在线观看 | 日本在线不卡免 | fuqer老师| 久久不射网| 亚洲日本久久一区二区va | 精品欧美男同同性videos | 日本色午夜 | 欧美性野久久久久久久久 | 狠狠色成人综合网图片区 | 非洲黑人gay巨大 | 亚洲成年人专区 | 欧美人曾交| 欧美摘花破处 | 久久五月综合婷婷中文云霸高清 | 范冰冰性xxxxhd | 久久精品无码人妻无码AV蜜臀 | 2020年国产精品午夜福利在线观看 | 国产精品美女福利视频免费专区 | 久久黄色录像 | 精品国产品在线18年 | 成人在线观看网站 | 日本伊人色综合网 | 国产成人精品一区二三区在线观看 | 美女的让男人桶爽免费看 | 日韩在线 中文字幕 | julia ann黑人巨大 | 国产精品亚洲片在线观看麻豆 | 消息称老熟妇乱视频一区二区 | 国产手机在线αⅴ片无码观看 | 免费亚洲视频在线观看 |