fastJSON

將返回值轉(zhuǎn)化成對象集合

 String response = WangsuUtils.CdnApi
List<WangsuCdn> wangsuCdns = JSON.parseArray(response, WangsuCdn.class);

獲取屬性值

String result = WangsuUtils.CdnApi
JSONObject jsonObject = JSONObject.parseObject(result);
 Integer code = jsonObject.getInteger("code");

將Json對象轉(zhuǎn)換為字符串

String post = WangsuUtils.CdnApi

JSONObject jsonObject = JSONObject.parseObject(post);

 JSONArray resultDetail = jsonObject.getJSONArray("resultDetail");

  String s = JSON.toJSONString(resultDetail);

Java 通過Request請求獲取IP地址對應(yīng)省份、城市
項(xiàng)目需要將不同省份的用戶,展示不同內(nèi)容,所以需要通過Request請求獲取IP地址, 然后通過IP獲取IP對應(yīng)省份。

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

  1. 通過Request獲取IP
  2. 通過IP獲取對應(yīng)省份、城市
  3. 通過設(shè)置的省份和IP對應(yīng)省份進(jìn)行比對,展示內(nèi)容

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

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)){
            //多次反向代理后會(huì)有多個(gè)ip值,第一個(gè)ip才是真實(shí)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獲取對應(yīng)省份、城市
使用【GeoLite2 City】庫
目前開源的IP地址庫與城市對應(yīng)關(guān)系用的比較多的是MaxMind公司的GeoLite數(shù)據(jù)庫,GeoLite數(shù)據(jù)庫有開源版本和收費(fèi)版本,我們使用的是開源版本,GeoLite目前已經(jīng)更新到2了,所以我們下載GeoLite2 City庫。下載地址是【http://dev.maxmind.com/geoip/geoip2/geolite2/】。

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

Java例子是這樣使用的:
首先在項(xiàng)目中加入maven支持

        <dependency>
            <groupId>com.maxmind.geoip2</groupId>
            <artifactId>geoip2</artifactId>
            <version>2.8.1</version>
        </dependency>

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

public static void main(String[] args) throws Exception{      
      // 創(chuàng)建 GeoLite2 數(shù)據(jù)庫     
      File database = new File("/Users/admin/GeoLite2-City.mmdb");     
      // 讀取數(shù)據(jù)庫內(nèi)容   
      DatabaseReader reader = new DatabaseReader.Builder(database).build();       
      InetAddress ipAddress = InetAddress.getByName("171.108.233.157");     

      // 獲取查詢結(jié)果      
      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")); // '廣西壯族自治區(qū)'

      // 獲取城市
      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

}  

如果是生產(chǎn)環(huán)境,可以直接創(chuàng)建一個(gè)Service,在Service初始化的時(shí)候創(chuàng)建reader對象,然后在公共方法中通過ip查詢地址,下面以省份為例:

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地址服務(wù)
 */
@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地址服務(wù)初始化異常:" + 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("根據(jù)IP[{}]獲取省份失敗:{}", ipAddress, e.getMessage());
            return null;
        }
    }
}

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

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

    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; // 按地域返回?cái)?shù)據(jù)
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容