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(Enumeration enumIpAddr=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); //创建参数队列 List formparams=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的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!