면책 조항 :이 문서는 블로거 원본입니다은 허용 블로거없이 복제 할 수 없다. https://blog.csdn.net/u012525096/article/details/86576520
방법
(1) 분의 요청에 의한 IP : 실제 IP 프록시 IP 등 (X - 필드를위한 전송)와.
(2) 타사 라이브러리 또는 (예 : Taobao의 http://ip.taobao.com/service/getIpInfo.php?ip= 등) 타사 API 제공 업체를 사용하여 지역 정보를 얻을 수있다.
(3) 지역 정보가 로컬 데이터베이스에서 쿼리합니다.
코드
(1) 요청으로부터 IP를 얻었다 :
private static String getRemoteIp(HttpServletRequest request) {
//x-forwarded-for:代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项
String ip = request.getHeader("x-forwarded-for");
//Proxy-Client-IP和WL-Proxy-Client-IP: 只有在Apache(Weblogic Plug-In Enable)+WebLogic搭配下出现,其中“WL”就是WebLogic的缩写
//访问路径是:Client -> Apache WebServer + Weblogic http plugin -> Weblogic Instances
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();
}
// ip = "61.51.253.90";
// ip = "218.25.19.153";
//0:0:0:0:0:0:0:1: IPV6的形式,win7下可能会出现
return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
}
(2)로부터 IP 면적을 얻었다 :
private static String getIpInfo(String ip) {
HttpGet httpGet = new HttpGet(baseUrl + ip);
try {
HttpResponse response = client.execute(httpGet);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));
String tmp;
String content = "";
while((tmp = reader.readLine()) != null) {
content += tmp+"\r\n";
}
return content;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
(3) 로컬 데이터베이스에서 더 많은 정보 영역 쿼리
public static Area getArea(HttpServletRequest request) {
String ip = getRemoteIp(request);
if (Objects.equals("127.0.0.1", ip)) {
Area area = new Area();
area.setId(367l);
area.setName("北京市");
return area;
}
String ipResp = getIpInfo(ip);
Response response = JSON.parseObject(ipResp, Response.class);
if (response.getCode() != 0) {
//FIXME 记录该用户/浏览器上一次访问时所在的城市,若没有则默认北京
Area area = new Area();
area.setId(367l);
area.setName("北京市");
return area;
}
IpInfo info = response.getData();
//本网站的业务只在中国开放
if (!Objects.equals("中国", info.getCountry())) {
//FIXME 记录该用户/浏览器上一次访问时所在的城市,若没有则默认北京
Area area = new Area();
area.setId(367l);
area.setName("北京市");
return area;
}
Area area = areaService.getByName(info.getCity());
if (null == area) {
//FIXME 记录该用户/浏览器上一次访问时所在的城市,若没有则默认北京
area = new Area();
area.setId(367l);
area.setName("北京市");
return area;
}
return area;
}
주 : (1) Response
엔티티 클래스 JSON의 API Taobao의는 JSON을 구문 분석에 대한 수익을 제공하기 위해 건설했다.
(2) areaService.getByName(info.getCity());
로컬 데이터베이스에서 쿼리에 대한 지역의 세부 사항.