获取IP地址(两种方式)
首先使用基于Spring Boot
搭建项目,在controller
添加HttpServletRequest
请求参数:
package com.wxz.utils;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* TODO
*
* @author wxz
* @date 2023/1/3 14:01
*/
public class IpUtils {
/**
* 根据Request获取IP地址,本地访问无法获取公网ip
*/
public static String getIpAddr(HttpServletRequest request) {
if (request == null) {
return "unknown";
}
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("X-Forwarded-For");
}
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.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
}
/**
* 通过调用接口的方式获取IP,可以获取到公网ip
*/
public static String getIp() {
try {
URL realUrl = new URL("http://whois.pconline.com.cn/ipJson.jsp");
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
conn.setRequestMethod("GET");
conn.setUseCaches(false);
conn.setReadTimeout(6000);
conn.setConnectTimeout(6000);
conn.setInstanceFollowRedirects(false);
int code = conn.getResponseCode();
StringBuilder sb = new StringBuilder();
String ip = "";
if (code == 200) {
InputStream in = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
ip = sb.substring(sb.indexOf("ip") + 5, sb.indexOf("pro") - 3);
}
return ip;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
在本地环境调用获取IP,要么是0:0:0:0:0:0:0:1
,或者是局域网IP
。所以需要部署到外网服务器才能获取到公网地址。部署到外网服务器能成功获取IP
地址。
局域网
IP
是以192.168.x.x
开头,或者是127.0.0.1
的IP
。
IP获取归属地
通过IP
获取归属地一般都从地址库找到匹配的地址,
/**
* 地址库--根据ip获取归属地
*/
public static String getAddressByIP(String strIP) {
try {
URL url = new URL("http://opendata.baidu.com/api.php?query=" + strIP+"&co=&resource_id=6006&t=1433920989928&ie=utf8&oe=utf-8&format=json");;
URLConnection conn = url.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String line = null;
StringBuffer result = new StringBuffer();
while ((line = reader.readLine()) != null) {
result.append(line);
}
reader.close();
JSONObject jsStr = JSONObject.parseObject(result.toString());
JSONArray jsData = (JSONArray) jsStr.get("data");
JSONObject data= (JSONObject) jsData.get(0);//位置
return (String) data.get("location");
} catch (IOException e) {
return "读取失败";
}
}
测试以及归属地
获取请求访问的方式
/**
* 获取登录的方式
*/
public static String getRequestHeader(HttpServletRequest request){
// 从浏览器获取请求头信息
String info= request.getHeader("user-agent");
if(info.contains("Windows")){
System.out.println("Windows pc端登陆");
return "Windows pc端登陆";
}
if(info.contains("Macintosh")){
System.out.println("Mac pc端登陆");
return "Mac pc端登陆";
}
if(info.contains("Android")) {
System.out.println("Android移动客户端");
return "Android移动客户端";
}
if(info.contains("iPhone")) {
System.out.println("iPhone移动客户端");
return "iPhone移动客户端";
}
if(info.contains("iPad")) {
System.out.println("iPad客户端");
return "iPad客户端";
}
System.out.println("其他客户端");
return "其他客户端";
}