首页 > 开发 > Java > 正文

java 获取服务器真实IP的实例

2024-07-13 10:11:06
字体:
来源:转载
供稿:网友

 java 获取服务器真实IP的实例

前言:

根据操作系统的不同,获取的结果不同,故需要区分系统,分别获取

实现代码:

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.net.HttpURLConnection;import java.net.Inet4Address;import java.net.InetAddress;import java.net.InterfaceAddress;import java.net.NetworkInterface;import java.net.SocketException;import java.net.URL;import java.net.URLConnection;import java.net.URLEncoder;import java.net.UnknownHostException;import java.util.ArrayList;import java.util.Enumeration;import java.util.Iterator;import java.util.List;import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.http.HttpEntity;import org.apache.http.NameValuePair;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import org.springframework.http.HttpMethod; /** * 常用工具类 * * @author 席红蕾 * @date 2016-09-27 * @version 1.0 */public class WebToolUtils {   /**   * 获取本地IP地址   *   * @throws SocketException   */  public static String getLocalIP() throws UnknownHostException, SocketException {    if (isWindowsOS()) {      return InetAddress.getLocalHost().getHostAddress();    } else {      return getLinuxLocalIp();    }  }   /**   * 判断操作系统是否是Windows   *   * @return   */  public static boolean isWindowsOS() {    boolean isWindowsOS = false;    String osName = System.getProperty("os.name");    if (osName.toLowerCase().indexOf("windows") > -1) {      isWindowsOS = true;    }    return isWindowsOS;  }   /**   * 获取本地Host名称   */  public static String getLocalHostName() throws UnknownHostException {    return InetAddress.getLocalHost().getHostName();  }   /**   * 获取Linux下的IP地址   *   * @return IP地址   * @throws SocketException   */  private static String getLinuxLocalIp() throws SocketException {    String ip = "";    try {      for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {        NetworkInterface intf = en.nextElement();        String name = intf.getName();        if (!name.contains("docker") && !name.contains("lo")) {          for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {            InetAddress inetAddress = enumIpAddr.nextElement();            if (!inetAddress.isLoopbackAddress()) {              String ipaddress = inetAddress.getHostAddress().toString();              if (!ipaddress.contains("::") && !ipaddress.contains("0:0:") && !ipaddress.contains("fe80")) {                ip = ipaddress;                System.out.println(ipaddress);              }            }          }        }      }    } catch (SocketException ex) {      System.out.println("获取ip地址异常");      ip = "127.0.0.1";      ex.printStackTrace();    }    System.out.println("IP:"+ip);    return ip;  }   /**   * 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址,   *   * 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?   * 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。   *   * 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130,   * 192.168.1.100   *   * 用户真实IP为: 192.168.1.110   *   * @param request   * @return   */  public static String getIpAddress(HttpServletRequest request) {    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("WL-Proxy-Client-IP");    }    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      ip = request.getHeader("HTTP_CLIENT_IP");    }    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      ip = request.getHeader("HTTP_X_FORWARDED_FOR");    }    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {      ip = request.getRemoteAddr();    }    return ip;  }   /**   * 向指定URL发送GET方法的请求   *   * @param url   *      发送请求的URL   * @param param   *      请求参数,请求参数应该是 name1=value1&name2=value2 的形式。   * @return URL 所代表远程资源的响应结果   */  // public static String sendGet(String url, String param) {  // String result = "";  // BufferedReader in = null;  // try {  // String urlNameString = url + "?" + param;  // URL realUrl = new URL(urlNameString);  // // 打开和URL之间的连接  // URLConnection connection = realUrl.openConnection();  // // 设置通用的请求属性  // connection.setRequestProperty("accept", "*/*");  // connection.setRequestProperty("connection", "Keep-Alive");  // connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible;  // MSIE 6.0; Windows NT 5.1;SV1)");  // // 建立实际的连接  // connection.connect();  // // 获取所有响应头字段  // Map<String, List<String>> map = connection.getHeaderFields();  // // 遍历所有的响应头字段  // for (String key : map.keySet()) {  // System.out.println(key + "--->" + map.get(key));  // }  // // 定义 BufferedReader输入流来读取URL的响应  // in = new BufferedReader(new  // InputStreamReader(connection.getInputStream()));  // String line;  // while ((line = in.readLine()) != null) {  // result += line;  // }  // } catch (Exception e) {  // System.out.println("发送GET请求出现异常!" + e);  // e.printStackTrace();  // }  // // 使用finally块来关闭输入流  // finally {  // try {  // if (in != null) {  // in.close();  // }  // } catch (Exception e2) {  // e2.printStackTrace();  // }  // }  // return result;  // }   /**   * 向指定 URL 发送POST方法的请求   *   * @param url   *      发送请求的 URL   * @param param   *      请求参数,请求参数应该是 name1=value1&name2=value2 的形式。   * @return 所代表远程资源的响应结果   */  public static void sendPost(String pathUrl, String name, String pwd, String phone, String content) {    // PrintWriter out = null;    // BufferedReader in = null;    // String result = "";    // try {    // URL realUrl = new URL(url);    // // 打开和URL之间的连接    // URLConnection conn = realUrl.openConnection();    // // 设置通用的请求属性    // conn.setRequestProperty("accept", "*/*");    // conn.setRequestProperty("connection", "Keep-Alive");    // conn.setRequestProperty("user-agent",    // "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");    // // 发送POST请求必须设置如下两行    // conn.setDoOutput(true);    // conn.setDoInput(true);    // // 获取URLConnection对象对应的输出流    // out = new PrintWriter(conn.getOutputStream());    // // 发送请求参数    // out.print(param);    // // flush输出流的缓冲    // out.flush();    // // 定义BufferedReader输入流来读取URL的响应    // in = new BufferedReader(    // new InputStreamReader(conn.getInputStream()));    // String line;    // while ((line = in.readLine()) != null) {    // result += line;    // }    // } catch (Exception e) {    // System.out.println("发送 POST 请求出现异常!"+e);    // e.printStackTrace();    // }    // //使用finally块来关闭输出流、输入流    // finally{    // try{    // if(out!=null){    // out.close();    // }    // if(in!=null){    // in.close();    // }    // }    // catch(IOException ex){    // ex.printStackTrace();    // }    // }    // return result;    try {      // 建立连接      URL url = new URL(pathUrl);      HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();       // //设置连接属性      httpConn.setDoOutput(true);// 使用 URL 连接进行输出      httpConn.setDoInput(true);// 使用 URL 连接进行输入      httpConn.setUseCaches(false);// 忽略缓存      httpConn.setRequestMethod("POST");// 设置URL请求方法      String requestString = "客服端要以以流方式发送到服务端的数据...";       // 设置请求属性      // 获得数据字节数据,请求数据流的编码,必须和下面服务器端处理请求流的编码一致      byte[] requestStringBytes = requestString.getBytes("utf-8");      httpConn.setRequestProperty("Content-length", "" + requestStringBytes.length);      httpConn.setRequestProperty("Content-Type", "  application/x-www-form-urlencoded");      httpConn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接      httpConn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");      httpConn.setRequestProperty("Accept-Encoding", "gzip, deflate");      httpConn.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3");      httpConn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0");      httpConn.setRequestProperty("Upgrade-Insecure-Requests", "1");       httpConn.setRequestProperty("account", name);      httpConn.setRequestProperty("passwd", pwd);      httpConn.setRequestProperty("phone", phone);      httpConn.setRequestProperty("content", content);       // 建立输出流,并写入数据      OutputStream outputStream = httpConn.getOutputStream();      outputStream.write(requestStringBytes);      outputStream.close();      // 获得响应状态      int responseCode = httpConn.getResponseCode();       if (HttpURLConnection.HTTP_OK == responseCode) {// 连接成功        // 当正确响应时处理数据        StringBuffer sb = new StringBuffer();        String readLine;        BufferedReader responseReader;        // 处理响应流,必须与服务器响应流输出的编码一致        responseReader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "utf-8"));        while ((readLine = responseReader.readLine()) != null) {          sb.append(readLine).append("/n");        }        responseReader.close();      }    } catch (Exception ex) {      ex.printStackTrace();    }  }   /**   * 执行一个HTTP POST请求,返回请求响应的HTML   *   * @param url   *      请求的URL地址   * @param params   *      请求的查询参数,可以为null   * @return 返回请求响应的HTML   */  public static void doPost(String url, String name, String pwd, String phone, String content) {    // 创建默认的httpClient实例.    CloseableHttpClient httpclient = HttpClients.createDefault();    // 创建httppost    HttpPost httppost = new HttpPost(url);    // 创建参数队列    List<NameValuePair> formparams = new ArrayList<NameValuePair>();    formparams.add(new BasicNameValuePair("account", name));    formparams.add(new BasicNameValuePair("passwd", pwd));    formparams.add(new BasicNameValuePair("phone", phone));    formparams.add(new BasicNameValuePair("content", content));     UrlEncodedFormEntity uefEntity;    try {      uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");      httppost.setEntity(uefEntity);      System.out.println("executing request " + httppost.getURI());      CloseableHttpResponse response = httpclient.execute(httppost);      try {        HttpEntity entity = response.getEntity();        if (entity != null) {          System.out.println("--------------------------------------");          System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));          System.out.println("--------------------------------------");        }      } finally {        response.close();      }    } catch (Exception e) {      e.printStackTrace();    } finally {      // 关闭连接,释放资源      try {        httpclient.close();      } catch (IOException e) {        e.printStackTrace();      }    }   }}

以上就是java 获取服务去的IP的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表