| package cc.mrbird.febs.common.utils; | 
|   | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.apache.commons.io.FileUtils; | 
| import org.lionsoul.ip2region.DataBlock; | 
| import org.lionsoul.ip2region.DbConfig; | 
| import org.lionsoul.ip2region.DbSearcher; | 
| import org.lionsoul.ip2region.Util; | 
|   | 
| import java.io.File; | 
| import java.io.IOException; | 
| import java.lang.reflect.Method; | 
|   | 
| /** | 
|  * @author MrBird | 
|  */ | 
| @Slf4j | 
| public class AddressUtil { | 
|   | 
|     @SuppressWarnings("all") | 
|     public static String getCityInfo(String ip) { | 
|         DbSearcher searcher = null; | 
|         try { | 
|             String dbPath = AddressUtil.class.getResource("/ip2region/ip2region.db").getPath(); | 
|             File file = new File(dbPath); | 
|             if (!file.exists()) { | 
|                 String tmpDir = System.getProperties().getProperty("java.io.tmpdir"); | 
|                 dbPath = tmpDir + "ip.db"; | 
|                 file = new File(dbPath); | 
|                 FileUtils.copyInputStreamToFile(AddressUtil.class.getClassLoader().getResourceAsStream("classpath:ip2region/ip2region.db"), file); | 
|             } | 
|             int algorithm = DbSearcher.BTREE_ALGORITHM; | 
|             DbConfig config = new DbConfig(); | 
|             searcher = new DbSearcher(config, dbPath); | 
|             Method method = null; | 
|             switch (algorithm) { | 
|                 case DbSearcher.BTREE_ALGORITHM: | 
|                     method = searcher.getClass().getMethod("btreeSearch", String.class); | 
|                     break; | 
|                 case DbSearcher.BINARY_ALGORITHM: | 
|                     method = searcher.getClass().getMethod("binarySearch", String.class); | 
|                     break; | 
|                 case DbSearcher.MEMORY_ALGORITYM: | 
|                     method = searcher.getClass().getMethod("memorySearch", String.class); | 
|                     break; | 
|             } | 
|             DataBlock dataBlock = null; | 
|             if (!Util.isIpAddress(ip)) { | 
|                 log.error("Error: Invalid ip address"); | 
|             } | 
|             dataBlock = (DataBlock) method.invoke(searcher, ip); | 
|             return dataBlock.getRegion(); | 
|         } catch (Exception e) { | 
|             log.error("获取IP地址失败,{}", e.getMessage()); | 
|         } finally { | 
|             if (searcher != null) { | 
|                 try { | 
|                     searcher.close(); | 
|                 } catch (IOException e) { | 
|                     e.printStackTrace(); | 
|                 } | 
|             } | 
|         } | 
|         return null; | 
|     } | 
|   | 
| } |