获取用户登陆所在的ip及获取所属信息

package com.tcl.topsale.download.entity;

public class GeoLocation {
    private String countryCode;
    private String countryName;
    private String region;
    private String regionName;
    private String city;
    private String postalCode;
    private String latitude;
    private String longitude;
    public String getCountryCode() {
        return countryCode;
    }
    public void setCountryCode(String countryCode) {
        this.countryCode = countryCode;
    }
    public String getCountryName() {
        return countryName;
    }
    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }
    public String getRegion() {
        return region;
    }
    public void setRegion(String region) {
        this.region = region;
    }
    public String getRegionName() {
        return regionName;
    }
    public void setRegionName(String regionName) {
        this.regionName = regionName;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getPostalCode() {
        return postalCode;
    }
    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }
    public String getLatitude() {
        return latitude;
    }
    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }
    public String getLongitude() {
        return longitude;
    }
    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }

    
    @Override
    public String toString() {
        return "GeoLocation [countryCode=" + countryCode + ", countryName="
                + countryName + ", region=" + region + ", regionName="
                + regionName + ", city=" + city + ", postalCode=" + postalCode
                + ", latitude=" + latitude + ", longitude=" + longitude + "]";
    }
}
package com.tcl.topsale.download.util;

import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.URL;


import javax.servlet.http.HttpServletRequest;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.maxmind.geoip2.DatabaseReader;
import com.maxmind.geoip2.exception.GeoIp2Exception;
import com.maxmind.geoip2.model.CityResponse;
import com.maxmind.geoip2.record.City;
import com.maxmind.geoip2.record.Country;
import com.maxmind.geoip2.record.Subdivision;
import com.tcl.topsale.download.entity.GeoLocation;
import com.weihua.common.base.action.BaseAction;


/**
 * 
 * @author fzl
 *根据用户登陆ip获取国家code
 */



public class GeoLocationUtil extends BaseAction{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private DatabaseReader reader;
    private static Logger logger = LoggerFactory.getLogger(GeoLocationUtil.class);


    public GeoLocationUtil() {
        String dataFile = "com/tcl/topsale/download/util/GeoLite2-City.mmdb";
        URL url = getClass().getClassLoader().getResource(dataFile);
        
        if (url == null) {
            System.err.println("location database is not found - " + dataFile);
        } else {
            try {
                File database = new File(url.getPath());
                System.out.println(new DatabaseReader.Builder(database).build()+"***************");
                reader = new DatabaseReader.Builder(database).build();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

//    public static void main(String[] args) {
//        GeoLocationUtil glt = new GeoLocationUtil();
//        String ip = "114.119.117.180";
//        glt.getLocationFromRequest(ip);
//        System.out.println(glt.getLocationFromRequest(ip));
//    }
    
    /**
     * 获取ip地址映射的国家
     * @param ipAddress
     * @return
     */
    public GeoLocation getLocationFromRequest(String ip) {
        GeoLocation location = getLocationV2(ip);
        return location;
    }
    
    /**
     * 获取ip地址
     * @param request
     * @return
     */
    public String getIpAddr(HttpServletRequest request) {
        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();
        }
        logger.info("Ip from user agent: {}", ip);
        // 多个反向代理IP时,取第一个
        int commaOffset = ip.indexOf(',');
        if (commaOffset < 0) {
            ip = ip.equals("0:0:0:0:0:0:0:1") ? "61.183.88.58" : ip;
            return ip;
        }
        ip = ip.substring(0, commaOffset);
        
        ip = ip.equals("0:0:0:0:0:0:0:1") ? "61.183.88.58" : ip;
    
        return ip;
    }

    
    /**
     * 获取ip地址映射的国家
     * @param ipAddress
     * @return
     */
    private GeoLocation getLocationV2(String ipAddress) {
        GeoLocation geoLocation = null;
        if (null == reader) {
            //System.err.println("location database is not found.");
            logger.error("location database is not found.");
        } else {
            try {
                geoLocation = new GeoLocation();
                InetAddress ipAdd = InetAddress.getByName(ipAddress);
                CityResponse response = reader.city(ipAdd);


                Country country = response.getCountry();
                geoLocation.setCountryCode(country.getIsoCode());
                geoLocation.setCountryName(country.getName());


                Subdivision subdivision = response.getMostSpecificSubdivision();
                geoLocation.setRegionName(subdivision.getName());


                City city = response.getCity();
                geoLocation.setCity(city.getName());
                geoLocation.setPostalCode(response.getPostal().getCode());
                geoLocation.setLatitude(String.valueOf(response.getLocation().getLatitude()));
                geoLocation.setLongitude(String.valueOf(response.getLocation().getLongitude()));
            } catch (IOException e) {
                e.printStackTrace();
                logger.error(e.getMessage());
            } catch (GeoIp2Exception e) {
                e.printStackTrace();
                logger.error(e.getMessage());
            }
        }
        return geoLocation;
    }
    
    
//    public static void main(String[] args) throws Exception{
//        File database = new File("D:/定位/GeoLite2-City.mmdb");
//        DatabaseReader reader = new DatabaseReader.Builder(database).build();
//        InetAddress ipAddress = InetAddress.getByName("14.106.124.11");
//        CityResponse response = reader.city(ipAddress);
//
//        Country country = response.getCountry();
//        System.out.println(country.getIsoCode());            // 'US'
//        System.out.println(country.getName());               // 'United States'
//        System.out.println(country.getNames().get("zh-CN")); // '美国'
//
//        Subdivision subdivision = response.getMostSpecificSubdivision();
//        System.out.println(subdivision.getName());    // 'Minnesota'
//        System.out.println(subdivision.getIsoCode()); // 'MN'
//
//        City city = response.getCity();
//        System.out.println(city.getName()); // 'Minneapolis'
//        System.out.println(city.getNames().get("zh-CN")); // 'Minneapolis'
//        Postal postal = response.getPostal();
//        System.out.println(postal.getCode()); // '55455'
//        Location location = response.getLocation();
//        System.out.println(location.getLatitude());  // 44.9733
//        System.out.println(location.getLongitude()); // -93.2323
//    }

}

需要用到 :GeoLite2-City.mmdb,

geoip2-2.2.0.jar,jackson-databind-2.5.3.jar,google-http-client-1.20.0.jar,

maxmind-db-1.0.0.jar,jackson-annotations-2.5.0.jar,core-2.5.3.jar,jsr305-1.3.9.jar

 <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>

package com.tcl.topsale.download.entity;
public class GeoLocation {private String countryCode;private String countryName;private String region;private String regionName;private String city;private String postalCode;private String latitude;private String longitude;public String getCountryCode() {return countryCode;}public void setCountryCode(String countryCode) {this.countryCode = countryCode;}public String getCountryName() {return countryName;}public void setCountryName(String countryName) {this.countryName = countryName;}public String getRegion() {return region;}public void setRegion(String region) {this.region = region;}public String getRegionName() {return regionName;}public void setRegionName(String regionName) {this.regionName = regionName;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getPostalCode() {return postalCode;}public void setPostalCode(String postalCode) {this.postalCode = postalCode;}public String getLatitude() {return latitude;}public void setLatitude(String latitude) {this.latitude = latitude;}public String getLongitude() {return longitude;}public void setLongitude(String longitude) {this.longitude = longitude;}
@Overridepublic String toString() {return "GeoLocation [countryCode=" + countryCode + ", countryName="+ countryName + ", region=" + region + ", regionName="+ regionName + ", city=" + city + ", postalCode=" + postalCode+ ", latitude=" + latitude + ", longitude=" + longitude + "]";}}

猜你喜欢

转载自www.cnblogs.com/Yusco/p/10766438.html
今日推荐