之前寫了一個獲取ip地址的方法,但是放網上一查顯示此Ip地址是局域網ip地址,要是想獲取請求端的真實公網ip地址怎么樣了,看了一些別人的博客后發現,想要獲取客戶端的公網ip必須借助第三方。
package com.jzproject.common.util;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
/**
*
* @Description:IP工具類
* @author zrt
* @date 2018年9月22日 上午10:38:13
*/
public class IPUtil {
private static final Logger logger = LoggerFactory.getLogger(IPUtil.class);
/**
*
* @Description:獲取客戶端的IP
* @author zrt
* @date 2018年9月22日 上午10:39:44
*/
public static String getIpAddress(HttpServletRequest request) {
//注意本地測試時,瀏覽器請求不要用localhost,要用本機IP訪問項目地址,不然這里取不到ip
// 獲取請求主機IP地址,如果通過代理進來,則透過防火牆獲取真實IP地址
String ip = request.getHeader("X-Forwarded-For");
if (logger.isInfoEnabled()) {
logger.info("getIpAddress(HttpServletRequest) - X-Forwarded-For - String ip=" + ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
if (logger.isInfoEnabled()) {
logger.info("getIpAddress(HttpServletRequest) - Proxy-Client-IP - String ip=" + ip);
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
if (logger.isInfoEnabled()) {
logger.info("getIpAddress(HttpServletRequest) - WL-Proxy-Client-IP - String ip=" + ip);
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
if (logger.isInfoEnabled()) {
logger.info("getIpAddress(HttpServletRequest) - HTTP_CLIENT_IP - String ip=" + ip);
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
if (logger.isInfoEnabled()) {
logger.info("getIpAddress(HttpServletRequest) - HTTP_X_FORWARDED_FOR - String ip=" + ip);
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
if (logger.isInfoEnabled()) {
logger.info("getIpAddress(HttpServletRequest) - getRemoteAddr - String ip=" + ip);
}
}
} else if (ip.length() > 15) {
String[] ips = ip.split(",");
for (int index = 0; index < ips.length; index++) {
String strIp = (String) ips[index];
if (!("unknown".equalsIgnoreCase(strIp))) {
ip = strIp;
break;
}
}
}
return ip;
}
public static void main(String[] args) throws Exception {
System.err.println("公網ipppppppppppp:" + getPublicIp());
}
/**
* @Description:獲取客戶端外網ip
* @Author:zrt
* @Date:2019/6/13 11:23
**/
public static String getPublicIp() {
try {
String path = "http://iframe.ip138.com/ic.asp";// 要獲得html頁面內容的地址
URL url = new URL(path);// 創建url對象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 打開連接
conn.setRequestProperty("contentType", "GBK"); // 設置url中文參數編碼
conn.setConnectTimeout(5 * 1000);// 請求的時間
conn.setRequestMethod("GET");// 請求方式
InputStream inStream = conn.getInputStream();
// readLesoSysXML(inStream);
BufferedReader in = new BufferedReader(new InputStreamReader(
inStream, "GBK"));
StringBuffer buffer = new StringBuffer();
String line = "";
// 讀取獲取到內容的最后一行,寫入
while ((line = in.readLine()) != null) {
buffer.append(line);
}
String str = buffer.toString();
String ipString1 = str.substring(str.indexOf("["));
// 獲取你的IP是中間的[182.149.82.50]內容
String ipsString2 = ipString1.substring(ipString1.indexOf("[") + 1,
ipString1.lastIndexOf("]"));
//獲取當前IP地址所在地址
/* String ipsString3=ipString1.substring(ipString1.indexOf(": "),ipString1.lastIndexOf("</center>"));
System.err.println(ipsString3);*/
// 返回公網IP值
return ipsString2;
} catch (Exception e) {
System.out.println("獲取公網IP連接超時");
return "連接超時";
}
}
}