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

网友投稿 351 2023-04-18


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

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 en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {

NetworkInterface intf = en.nextElement();

String name = intf.getName();

if (!name.contains("docker") && !name.contains("lo")) {

for (Enumeration 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> 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();

EoglXmfnXI

// //设置连接属性

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 formparams = new ArrayList();

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的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springmvc之获取参数的方法(必看)
下一篇:使用socket进行服务端与客户端传文件的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~