获取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 .HttpURLConnection;import .URL;/*** TODO** @author wxz* @date /1/3 14:01*/public class IpUtils {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*/public static String getIp() {try {URL realUrl = new URL("/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("/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 "其他客户端";}