java 获取服务器真实IP的实例
java获取服务器真实IP的实例
前言:
根据操作系统的不同,获取的结果不同,故需要区分系统,分别获取
实现代码:
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.io.PrintWriter;
importjava.io.UnsupportedEncodingException;
importjava.net.HttpURLConnection;
importjava.net.Inet4Address;
importjava.net.InetAddress;
importjava.net.InterfaceAddress;
importjava.net.NetworkInterface;
importjava.net.SocketException;
importjava.net.URL;
importjava.net.URLConnection;
importjava.net.URLEncoder;
importjava.net.UnknownHostException;
importjava.util.ArrayList;
importjava.util.Enumeration;
importjava.util.Iterator;
importjava.util.List;
importjava.util.Map;
importjavax.servlet.http.HttpServletRequest;
importorg.apache.http.HttpEntity;
importorg.apache.http.NameValuePair;
importorg.apache.http.client.ClientProtocolException;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.CloseableHttpResponse;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.impl.client.CloseableHttpClient;
importorg.apache.http.impl.client.HttpClients;
importorg.apache.http.message.BasicNameValuePair;
importorg.apache.http.util.EntityUtils;
importorg.springframework.http.HttpMethod;
/**
*常用工具类
*
*@author席红蕾
*@date2016-09-27
*@version1.0
*/
publicclassWebToolUtils{
/**
*获取本地IP地址
*
*@throwsSocketException
*/
publicstaticStringgetLocalIP()throwsUnknownHostException,SocketException{
if(isWindowsOS()){
returnInetAddress.getLocalHost().getHostAddress();
}else{
returngetLinuxLocalIp();
}
}
/**
*判断操作系统是否是Windows
*
*@return
*/
publicstaticbooleanisWindowsOS(){
booleanisWindowsOS=false;
StringosName=System.getProperty("os.name");
if(osName.toLowerCase().indexOf("windows")>-1){
isWindowsOS=true;
}
returnisWindowsOS;
}
/**
*获取本地Host名称
*/
publicstaticStringgetLocalHostName()throwsUnknownHostException{
returnInetAddress.getLocalHost().getHostName();
}
/**
*获取Linux下的IP地址
*
*@returnIP地址
*@throwsSocketException
*/
privatestaticStringgetLinuxLocalIp()throwsSocketException{
Stringip="";
try{
for(Enumerationen=NetworkInterface.getNetworkInterfaces();en.hasMoreElements();){
NetworkInterfaceintf=en.nextElement();
Stringname=intf.getName();
if(!name.contains("docker")&&!name.contains("lo")){
for(EnumerationenumIpAddr=intf.getInetAddresses();enumIpAddr.hasMoreElements();){
InetAddressinetAddress=enumIpAddr.nextElement();
if(!inetAddress.isLoopbackAddress()){
Stringipaddress=inetAddress.getHostAddress().toString();
if(!ipaddress.contains("::")&&!ipaddress.contains("0:0:")&&!ipaddress.contains("fe80")){
ip=ipaddress;
System.out.println(ipaddress);
}
}
}
}
}
}catch(SocketExceptionex){
System.out.println("获取ip地址异常");
ip="127.0.0.1";
ex.printStackTrace();
}
System.out.println("IP:"+ip);
returnip;
}
/**
*获取用户真实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
*
*@paramrequest
*@return
*/
publicstaticStringgetIpAddress(HttpServletRequestrequest){
Stringip=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();
}
returnip;
}
/**
*向指定URL发送GET方法的请求
*
*@paramurl
*发送请求的URL
*@paramparam
*请求参数,请求参数应该是name1=value1&name2=value2的形式。
*@returnURL所代表远程资源的响应结果
*/
//publicstaticStringsendGet(Stringurl,Stringparam){
//Stringresult="";
//BufferedReaderin=null;
//try{
//StringurlNameString=url+"?"+param;
//URLrealUrl=newURL(urlNameString);
////打开和URL之间的连接
//URLConnectionconnection=realUrl.openConnection();
////设置通用的请求属性
//connection.setRequestProperty("accept","*/*");
//connection.setRequestProperty("connection","Keep-Alive");
//connection.setRequestProperty("user-agent","Mozilla/4.0(compatible;
//MSIE6.0;WindowsNT5.1;SV1)");
////建立实际的连接
//connection.connect();
////获取所有响应头字段
//Map>map=connection.getHeaderFields();
////遍历所有的响应头字段
//for(Stringkey:map.keySet()){
//System.out.println(key+"--->"+map.get(key));
//}
////定义BufferedReader输入流来读取URL的响应
//in=newBufferedReader(new
//InputStreamReader(connection.getInputStream()));
//Stringline;
//while((line=in.readLine())!=null){
//result+=line;
//}
//}catch(Exceptione){
//System.out.println("发送GET请求出现异常!"+e);
//e.printStackTrace();
//}
////使用finally块来关闭输入流
//finally{
//try{
//if(in!=null){
//in.close();
//}
//}catch(Exceptione2){
//e2.printStackTrace();
//}
//}
//returnresult;
//}
/**
*向指定URL发送POST方法的请求
*
*@paramurl
*发送请求的URL
*@paramparam
*请求参数,请求参数应该是name1=value1&name2=value2的形式。
*@return所代表远程资源的响应结果
*/
publicstaticvoidsendPost(StringpathUrl,Stringname,Stringpwd,Stringphone,Stringcontent){
//PrintWriterout=null;
//BufferedReaderin=null;
//Stringresult="";
//try{
//URLrealUrl=newURL(url);
////打开和URL之间的连接
//URLConnectionconn=realUrl.openConnection();
////设置通用的请求属性
//conn.setRequestProperty("accept","*/*");
//conn.setRequestProperty("connection","Keep-Alive");
//conn.setRequestProperty("user-agent",
//"Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)");
////发送POST请求必须设置如下两行
//conn.setDoOutput(true);
//conn.setDoInput(true);
////获取URLConnection对象对应的输出流
//out=newPrintWriter(conn.getOutputStream());
////发送请求参数
//out.print(param);
////flush输出流的缓冲
//out.flush();
////定义BufferedReader输入流来读取URL的响应
//in=newBufferedReader(
//newInputStreamReader(conn.getInputStream()));
//Stringline;
//while((line=in.readLine())!=null){
//result+=line;
//}
//}catch(Exceptione){
//System.out.println("发送POST请求出现异常!"+e);
//e.printStackTrace();
//}
////使用finally块来关闭输出流、输入流
//finally{
//try{
//if(out!=null){
//out.close();
//}
//if(in!=null){
//in.close();
//}
//}
//catch(IOExceptionex){
//ex.printStackTrace();
//}
//}
//returnresult;
try{
//建立连接
URLurl=newURL(pathUrl);
HttpURLConnectionhttpConn=(HttpURLConnection)url.openConnection();
////设置连接属性
httpConn.setDoOutput(true);//使用URL连接进行输出
httpConn.setDoInput(true);//使用URL连接进行输入
httpConn.setUseCaches(false);//忽略缓存
httpConn.setRequestMethod("POST");//设置URL请求方法
StringrequestString="客服端要以以流方式发送到服务端的数据...";
//设置请求属性
//获得数据字节数据,请求数据流的编码,必须和下面服务器端处理请求流的编码一致
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(WindowsNT6.1;Win64;x64;rv:49.0)Gecko/20100101Firefox/49.0");
httpConn.setRequestProperty("Upgrade-Insecure-Requests","1");
httpConn.setRequestProperty("account",name);
httpConn.setRequestProperty("passwd",pwd);
httpConn.setRequestProperty("phone",phone);
httpConn.setRequestProperty("content",content);
//建立输出流,并写入数据
OutputStreamoutputStream=httpConn.getOutputStream();
outputStream.write(requestStringBytes);
outputStream.close();
//获得响应状态
intresponseCode=httpConn.getResponseCode();
if(HttpURLConnection.HTTP_OK==responseCode){//连接成功
//当正确响应时处理数据
StringBuffersb=newStringBuffer();
StringreadLine;
BufferedReaderresponseReader;
//处理响应流,必须与服务器响应流输出的编码一致
responseReader=newBufferedReader(newInputStreamReader(httpConn.getInputStream(),"utf-8"));
while((readLine=responseReader.readLine())!=null){
sb.append(readLine).append("\n");
}
responseReader.close();
}
}catch(Exceptionex){
ex.printStackTrace();
}
}
/**
*执行一个HTTPPOST请求,返回请求响应的HTML
*
*@paramurl
*请求的URL地址
*@paramparams
*请求的查询参数,可以为null
*@return返回请求响应的HTML
*/
publicstaticvoiddoPost(Stringurl,Stringname,Stringpwd,Stringphone,Stringcontent){
//创建默认的httpClient实例.
CloseableHttpClienthttpclient=HttpClients.createDefault();
//创建httppost
HttpPosthttppost=newHttpPost(url);
//创建参数队列
Listformparams=newArrayList();
formparams.add(newBasicNameValuePair("account",name));
formparams.add(newBasicNameValuePair("passwd",pwd));
formparams.add(newBasicNameValuePair("phone",phone));
formparams.add(newBasicNameValuePair("content",content));
UrlEncodedFormEntityuefEntity;
try{
uefEntity=newUrlEncodedFormEntity(formparams,"UTF-8");
httppost.setEntity(uefEntity);
System.out.println("executingrequest"+httppost.getURI());
CloseableHttpResponseresponse=httpclient.execute(httppost);
try{
HttpEntityentity=response.getEntity();
if(entity!=null){
System.out.println("--------------------------------------");
System.out.println("Responsecontent:"+EntityUtils.toString(entity,"UTF-8"));
System.out.println("--------------------------------------");
}
}finally{
response.close();
}
}catch(Exceptione){
e.printStackTrace();
}finally{
//关闭连接,释放资源
try{
httpclient.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
以上就是java获取服务去的IP的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!