java web获取客户端外网ip和所在区域
@参考文章1、@参考文章2、@参考文章3、@参考文章4,@之前同事的项目
controller
@Controller
@RequestMapping("/home")
public class HomeController {
@RequestMapping("/")
public String index(HttpServletRequest req) {
try {
String ip = IpUtil.getOuterNetIp(req);//获取外网ip
System.out.println(ip);
String ipCity = IpUtil.getIpArea(ip);//根据外网ip获取所在区域
System.out.println(ipCity);
req.setAttribute("ipCity", ipCity);
} catch (Exception e) {
e.printStackTrace();
}
return "home";
}
}
IpUtil
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils;
import org.json.JSONException;
import org.json.JSONObject; import sun.net.util.IPAddressUtil; /**
* @todo ip工具类
* @author yanan
* @date 2018年11月12日
*/
public class IpUtil { /**
* @todo 获取外网ip所在区域
* @param
* @date 2018年11月12日
* @author yanan
*/
public static String getIpArea(String ip) throws Exception {
// 淘宝的ip定位
JSONObject json = readJsonFromUrl("http://ip.taobao.com/service/getIpInfo.php?ip=" + ip);
if (json.has("code")) {
if ((json.get("code").toString().trim()).equalsIgnoreCase("0")) {
String strIp = ((JSONObject) json.get("data")).get("city").toString();
return strIp;
} else {
return "郑州";
}
} else {
return "郑州";
}
}
/**
* @todo 百度api ip接口
* @param
* @date 2018年11月9日
* @author yanan
*/
public static JSONObject readJsonFromUrl(String url) throws Exception, JSONException {
InputStream is = null;
try {
URL ul = new URL(url); // 创建 URL
HttpURLConnection urlCon = (HttpURLConnection) ul.openConnection();
urlCon.setConnectTimeout(2000);
urlCon.setReadTimeout(2000);
// Long b = System.currentTimeMillis();
is = urlCon.getInputStream(); // 打开到这个URL的流
// System.out.println("获取百度api
// ip接口:="+(System.currentTimeMillis()-b));
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = new JSONObject(jsonText);
return json;
} catch (Exception e) {
e.printStackTrace();
JSONObject jsonObj = new JSONObject();
jsonObj.put("status", "1");
// System.out.println("new jsonObj status=0,new jsonObj status=0new
// jsonObj status=0new jsonObj status=0");
return jsonObj;
} finally {
if (null != is)
is.close();
}
}
/**
* @todo 将输入流转换成字符串
* @param
* @date 2018年11月9日
* @author yanan
*/
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
} /**
* @todo 获取外网ip
* @param
* @date 2018年11月12日
* @author yanan
* @throws Exception
*/
public static String getOuterNetIp(final HttpServletRequest request) throws Exception {
String ipAddr = getIpAddr(request);//获取ip地址
boolean internalIp = internalIp(ipAddr);//判断ip是否内网ip
if(!internalIp){//外网地址直接返回
return ipAddr;
}
String result = "";
URLConnection connection;
BufferedReader in = null;
try {
URL url = new URL("http://www.icanhazip.com");
connection = url.openConnection();
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "KeepAlive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
connection.setConnectTimeout(3000);
connection.setReadTimeout(3000);
connection.connect();
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (MalformedURLException e) {
} catch (IOException e) {
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
}
}
return result;
}
/**
* @todo 判断是否内网ip
* @param
* @date 2018年11月12日
* @author yanan
*/
public static boolean internalIp(String ip) {
if ("127.0.0.1".equalsIgnoreCase(ip))
return true;
if ("0:0:0:0:0:0:0:1".equals(ip))
return true;
byte[] addr = IPAddressUtil.textToNumericFormatV4(ip);
return internalIp(addr);
}
/**
* @todo 判断解析后的ip是否内网
* @param
* @date 2018年11月12日
* @author yanan
*/
public static boolean internalIp(byte[] addr) {
final byte b0 = addr[0];
final byte b1 = addr[1];
// 10.x.x.x/8
final byte SECTION_1 = 0x0A;
// 172.16.x.x/12
final byte SECTION_2 = (byte) 0xAC;
final byte SECTION_3 = (byte) 0x10;
final byte SECTION_4 = (byte) 0x1F;
// 127.0.0.1/16
final byte SECTION_5 = (byte) 0xC0;
final byte SECTION_6 = (byte) 0xA8;
switch (b0) {
case SECTION_1:
return true;
case SECTION_2:
if (b1 >= SECTION_3 && b1 <= SECTION_4) {
return true;
}
case SECTION_5:
switch (b1) {
case SECTION_6:
return true;
}
default:
return false;
}
}
/**
* @todo 获取ip地址
* @param
* @date 2018年11月12日
* @author yanan
*/
public static final String getIpAddr(final HttpServletRequest request) throws Exception {
if (request == null) {
throw (new Exception("======================request为null======================"));
}
/**
* 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr()
* 这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
* 经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过
* 转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR等信息。用以跟踪原有的客户
* 端IP地址和原来客户端请求的服务器地址。
* 假定客户端通过多级代理,最终到达服务器端(nginx,squid,haproxy);此时经过多级反向的代理,
* 通过方法getRemoteAddr(),得不到客户端真实IP,可以通过x-forwarded-for等获得转发后请求信息。
* 因此获取ip的步骤应为:先获取各种代理服务器ip,若为空再获取request.getRemoteAddr()
*/ //x-forwarded-for是一个 Squid 开发的字段,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项。当客户端请求被转发,
//格式为X-Forwarded-For:client1,proxy1,proxy2,一般情况下,第一个ip为客户端真实ip,
//IP将会追加在其后并以逗号隔开,后面的为经过的代理服务器ip。现在大部分的代理都会加上这个请求头。
String ipString = request.getHeader("x-forwarded-for");
//用apache http做代理时一般会加上Proxy-Client-IP请求头
if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) {
ipString = request.getHeader("Proxy-Client-IP");
}
//WL-Proxy-Client-IP是他的weblogic插件加上的头。
if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) {
ipString = request.getHeader("WL-Proxy-Client-IP");
}
//HTTP_CLIENT_IP :有些代理服务器会加上此请求头。
if (ipString == null || ipString.length() == 0 || "unknown".equalsIgnoreCase(ipString)) {
ipString = request.getHeader("HTTP_CLIENT_IP");
System.out.println("HTTP_CLIENT_IP ipString: " + ipString);
}
if (ipString == null || ipString.length() == 0 || "unknown".equalsIgnoreCase(ipString)) {
ipString = request.getHeader("HTTP_X_FORWARDED_FOR");
System.out.println("HTTP_X_FORWARDED_FOR ipString: " + ipString);
}
//nginx代理一般会加上此请求头。
if (ipString == null || ipString.length() == 0 || "unknown".equalsIgnoreCase(ipString)) {
ipString = request.getHeader("X-Real-IP");
System.out.println("X-Real-IP ipString: " + ipString);
}
//当不是上述(代理)方式访问时,request.getRemoteAddr()直接获取客户真实ip
if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) {
ipString = request.getRemoteAddr(); //客户端未经过代理,直接访问服务器端(nginx,squid,haproxy);
}
// 多个路由时,取第一个非unknown的ip
final String[] arr = ipString.split(",");
for (final String str : arr) {
if (!"unknown".equalsIgnoreCase(str)) {
ipString = str;
break;
}
}
return ipString;
} }
java web获取客户端外网ip和所在区域的更多相关文章
- Java Web 获取客户端真实IP
Java Web 获取客户端真实IP 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP.一般分为两种情况: 方 ...
- Android 获取本地外网IP、内网IP、计算机名等信息
一.获取本地外网IP public static String GetNetIp() { URL infoUrl = null; InputStream inStream = null; try { ...
- java代码获取客户端的真实ip
java代码获取客户端的真实ip protected String getIpAddr(HttpServletRequest request) { String ip = request.getHea ...
- C#获取路由器外网IP,MAC地址
C#实现的获取路由器MAC地址,路由器外网地址.对于要获取路由器MAC地址,一定需要知道路由器web管理系统的用户名和密码.至于获取路由器的外网IP地址,可以不需要知道路由器web管理系统的用户名和密 ...
- Java获得系统的外网IP
关于如何获得系统外网IP?在网上找了好久,大多数解决方案都没法直接用,所以今天和大家分享一段获得外网IP的代码! import java.net.Inet4Address; import java.n ...
- django-返回客户端外网ip服务
在服务器应用初始化的时候,比如salt-minion,需要在配置文件里说明自己的id,一般用ip. 如果都在一个内网里,从ip命令里获取就行了. 但现在的企业后台环境更加复杂,很多都是跨机房.有物理机 ...
- java web 获取客户端操作系统信息
package com.java.basic.pattern; import java.util.regex.Matcher; import java.util.regex.Pattern; /** ...
- linux C++ 获取服务器外网IP地址(使用系统调用system)
废话不多说,直接贴代码: #include<string.h> #include<stdlib.h> #include<stdio.h> #include<s ...
- 通过特定获取获取电脑外网IP地址
void get_WanIp() { }; ]; ]; ; }; GetTempPathA(MAX_PATH,szFilePath); strcat(szFilePath,"IPinTheW ...
随机推荐
- Nginx代理webSocket经常中断的解决方案, 如何保持长连接
背景 这天气够热的,要处理的事情也够多的.... 1 2 想看解决的,直接 ctrl+f搜索关键字‘配置点’ 开始前交代(想看原因的看这个,个人观点,不代表正确) 解说:今天用nginx反代通讯项目, ...
- 【Noip模拟 20161005】友好城市
问题描述 小ww生活在美丽的ZZ国.ZZ国是一个有nn个城市的大国,城市之间有mm条单向公路(连 接城市ii.jj的公路只能从ii连到jj).城市ii.jj是友好城市当且仅当从城市ii能到达城市jj并 ...
- RTS寻路相关资料收集
http://www.cocoachina.com/game/20150824/13174.html RVO算法 RVO避开agent
- Linux性能测试分析命令_iostat
iostat用于输出CPU和磁盘I/O相关的统计信息 iostat语法 用法:iostat [ 选项 ] [ <时间间隔> [ <次数> ]] 常用选项说明: -c:只显示系统 ...
- 遍历DOM树,获取子节点
获取子节点的方法有: 方法 说明 children() 选取子节点,可以带过滤参数.但只能选择子节点,不能选择孙子节点. find() 选取子节点,可以带过滤参数.可以选择子节点及孙子节点 ...
- python3.6安装-windows
1.打开python官网 2.找到下载链接 3.选择对应的版本下载 4.下载完成后打开安装包并执行,运行出该界面. 5.这里是安装到C盘上(默认安装) 6.此处为自定义安装 7.选择自定义安装,并全选 ...
- 拓扑排序-有向无环图(DAG, Directed Acyclic Graph)
条件: 1.每个顶点出现且只出现一次. 2.若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面. 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说. 一 ...
- lvm磁盘分区
初始分区情况见下: 创建lvm类型磁盘 创建卷pv 添加pv到vg中,vg名vgroup0 创建lv lvcreate -L 2g -n zookeeper vgroup0 在vg vgroup0中创 ...
- 我的一次rsync+inotify本地数据同步示例
环境: web工作目录:/var/www/mydafuhao git仓库目录: /var/www/mydafuhao.git/mydafuhao 需求:inotify监控git仓库目录,发现有版本更新 ...
- python print 美化
本来是按照百度搜到的教程来为print输出添加颜色 然后bing了下,已经有封装好的包了,就是python-blessings 效果如图 API网址:https://blessings.readthe ...