You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					
					
						
							367 lines
						
					
					
						
							13 KiB
						
					
					
				
			
		
		
	
	
							367 lines
						
					
					
						
							13 KiB
						
					
					
				| package com.ynxbd.common.helper.common;
 | |
| 
 | |
| import org.apache.commons.lang3.StringUtils;
 | |
| 
 | |
| import javax.servlet.ServletOutputStream;
 | |
| import javax.servlet.http.HttpServletRequest;
 | |
| import javax.servlet.http.HttpServletResponse;
 | |
| import java.io.*;
 | |
| import java.net.*;
 | |
| import java.nio.charset.StandardCharsets;
 | |
| import java.util.Enumeration;
 | |
| import java.util.regex.Matcher;
 | |
| import java.util.regex.Pattern;
 | |
| 
 | |
| /**
 | |
|  * @Author wsq
 | |
|  * @Date 2021/2/8 14:53
 | |
|  * @Copyright @ 2020 云南新八达科技有限公司 All rights reserved.
 | |
|  */
 | |
| public class HttpHelper {
 | |
| 
 | |
|     /**
 | |
|      * 获取访问者真实IP地址
 | |
|      */
 | |
|     public static String getVisitorIP(HttpServletRequest request) {
 | |
|         String ip = request.getHeader("X-Real-IP");
 | |
|         if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
 | |
|             if (ip.contains("../") || ip.contains("..\\")) {
 | |
|                 return "";
 | |
|             }
 | |
|             return ip;
 | |
|         }
 | |
|         ip = request.getHeader("X-Forwarded-For");
 | |
|         if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
 | |
|             // 多次反向代理后会有多个IP值,第一个为真实IP。
 | |
|             int index = ip.indexOf(',');
 | |
|             if (index != -1) {
 | |
|                 ip = ip.substring(0, index);
 | |
|             }
 | |
|             if (ip.contains("../") || ip.contains("..\\")) {
 | |
|                 return "";
 | |
|             }
 | |
|             return ip;
 | |
|         } else {
 | |
|             ip = request.getRemoteAddr();
 | |
|             if (ip.contains("../") || ip.contains("..\\")) {
 | |
|                 return "";
 | |
|             }
 | |
|             if (ip.equals("0:0:0:0:0:0:0:1")) {
 | |
|                 ip = "127.0.0.1";
 | |
|             }
 | |
|             return ip;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     public static String getIpAddress(HttpServletRequest request) {
 | |
|         String remoteAddress = request.getRemoteAddr();
 | |
|         String forwarded = request.getHeader("X-Forwarded-For");
 | |
|         String realIp = request.getHeader("X-Real-IP");
 | |
| 
 | |
|         String ip;
 | |
|         if (realIp == null) {
 | |
|             if (forwarded == null) {
 | |
|                 ip = remoteAddress;
 | |
|             } else {
 | |
|                 ip = remoteAddress + "/" + forwarded.split(",")[0];
 | |
|             }
 | |
|         } else {
 | |
|             if (realIp.equals(forwarded)) {
 | |
|                 ip = realIp;
 | |
|             } else {
 | |
|                 if (forwarded != null) {
 | |
|                     forwarded = forwarded.split(",")[0];
 | |
|                 }
 | |
|                 ip = forwarded == null ? realIp : realIp + "/" + forwarded;
 | |
|             }
 | |
|         }
 | |
|         return ip;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 获取本机的内网ip地址
 | |
|      */
 | |
|     public static String getInIP() {
 | |
|         String resultIp = null;
 | |
|         try {
 | |
|             // 外网IP
 | |
|             String outIp = null;
 | |
| 
 | |
|             // 本地IP,如果没有配置外网IP则返回它
 | |
|             String localhostIp = null;
 | |
|             Enumeration<NetworkInterface> netInterfaces;
 | |
|             netInterfaces = NetworkInterface.getNetworkInterfaces();
 | |
|             InetAddress ip;
 | |
|             boolean flag = false; // 是否找到外网IP
 | |
|             while (netInterfaces.hasMoreElements() && !flag) {
 | |
|                 NetworkInterface ni = netInterfaces.nextElement();
 | |
|                 Enumeration<InetAddress> address = ni.getInetAddresses();
 | |
|                 while (address.hasMoreElements()) {
 | |
|                     ip = address.nextElement();
 | |
|                     if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && !ip.getHostAddress().contains(":")) {// 外网IP
 | |
|                         outIp = ip.getHostAddress();
 | |
|                         flag = true;
 | |
|                         break;
 | |
|                     } else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && !ip.getHostAddress().contains(":")) {// 内网IP
 | |
|                         localhostIp = ip.getHostAddress();
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             if (outIp != null && !"".equals(outIp)) {
 | |
|                 resultIp = outIp;
 | |
|             } else {
 | |
|                 resultIp = localhostIp;
 | |
|             }
 | |
|         } catch (Exception e) {
 | |
|             ErrorHelper.println(e);
 | |
|         }
 | |
|         return resultIp;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 获取本机的外网ip地址
 | |
|      */
 | |
|     public static String getOutIP() {
 | |
|         String ip = "";
 | |
|         StringBuilder result = new StringBuilder();
 | |
|         HttpURLConnection urlConnection = null;
 | |
|         BufferedReader in = null;
 | |
|         try {
 | |
|             URL url = new URL("http://ip.chinaz.com");
 | |
|             urlConnection = (HttpURLConnection) url.openConnection();
 | |
|             in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), StandardCharsets.UTF_8));
 | |
| 
 | |
|             String read;
 | |
|             while ((read = in.readLine()) != null) {
 | |
|                 result.append(read).append("\r\n");
 | |
|             }
 | |
|         } catch (IOException e) {
 | |
|             ErrorHelper.println(e);
 | |
|         } finally {
 | |
|             try {
 | |
|                 if (urlConnection != null) {
 | |
|                     urlConnection.disconnect();
 | |
|                 }
 | |
|                 if (in != null) {
 | |
|                     in.close();
 | |
|                 }
 | |
|             } catch (IOException e) {
 | |
|                 ErrorHelper.println(e);
 | |
|             }
 | |
|         }
 | |
|         Pattern p = Pattern.compile("<dd class=\"fz24\">(.*?)</dd>");
 | |
|         Matcher m = p.matcher(result.toString());
 | |
|         if (m.find()) {
 | |
|             ip = m.group(1);
 | |
|         }
 | |
|         return ip;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 解析ip地址
 | |
|      * <p>
 | |
|      * 设置访问地址为http://ip.taobao.com/service/getIpInfo.php
 | |
|      * 设置请求参数为ip=[已经获得的ip地址]
 | |
|      * 设置解码方式为UTF-8
 | |
|      *
 | |
|      * @param content  请求的参数 格式为:ip=192.168.1.101
 | |
|      * @param encoding 服务器端请求编码。如GBK,UTF-8等
 | |
|      */
 | |
|     public static String getAddresses(String content, String encoding) throws UnsupportedEncodingException {
 | |
|         //设置访问地址
 | |
|         String urlStr = "http://ip.taobao.com/service/getIpInfo.php";
 | |
|         // 从http://whois.pconline.com.cn取得IP所在的省市区信息
 | |
|         String returnStr = getResult(urlStr, content, encoding);
 | |
|         if (returnStr != null) {
 | |
|             // 处理返回的省市区信息
 | |
|             // System.out.println(returnStr);
 | |
|             String[] temp = returnStr.split(",");
 | |
|             if (temp.length < 3) {
 | |
|                 return "0";// 无效IP,局域网测试
 | |
|             }
 | |
| 
 | |
|             String country = ""; // 国家
 | |
|             String area = "";    // 地区
 | |
|             String region = "";  // 省份
 | |
|             String city = "";    // 市区
 | |
|             String county = "";  // 地区
 | |
|             String isp = "";     // ISP公司
 | |
|             for (int i = 0; i < temp.length; i++) {
 | |
|                 switch (i) {
 | |
|                     case 2:
 | |
|                         country = (temp[i].split(":"))[1].replaceAll("\"", "");
 | |
|                         country = URLDecoder.decode(country, encoding);// 国家
 | |
|                         break;
 | |
|                     case 3:
 | |
|                         area = (temp[i].split(":"))[1].replaceAll("\"", "");
 | |
|                         area = URLDecoder.decode(area, encoding);// 地区
 | |
|                         break;
 | |
|                     case 4:
 | |
|                         region = (temp[i].split(":"))[1].replaceAll("\"", "");
 | |
|                         region = URLDecoder.decode(region, encoding);// 省份
 | |
|                         break;
 | |
|                     case 5:
 | |
|                         city = (temp[i].split(":"))[1].replaceAll("\"", "");
 | |
|                         city = URLDecoder.decode(city, encoding);// 市区
 | |
|                         if ("内网IP".equals(city)) {
 | |
|                             return "地址为:内网IP";
 | |
|                         }
 | |
|                         break;
 | |
|                     case 6:
 | |
|                         county = (temp[i].split(":"))[1].replaceAll("\"", "");
 | |
|                         county = URLDecoder.decode(county, encoding);// 地区
 | |
|                         break;
 | |
|                     case 7:
 | |
|                         isp = (temp[i].split(":"))[1].replaceAll("\"", "");
 | |
|                         isp = URLDecoder.decode(isp, encoding); // ISP公司
 | |
|                         break;
 | |
|                 }
 | |
|             }
 | |
|             return "地址为:" + country + "," + region + "省," + city + "市," + county + "," + "ISP公司:" + isp;
 | |
|         }
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 获取本机的外网ip地址
 | |
|      *
 | |
|      * @return 本机的外网ip地址
 | |
|      */
 | |
|     public String getV4IP() {
 | |
|         String ip = "";
 | |
|         String china = "http://ip.chinaz.com";
 | |
| 
 | |
|         StringBuilder inputLine = new StringBuilder();
 | |
|         HttpURLConnection urlConnection = null;
 | |
|         BufferedReader in = null;
 | |
|         try {
 | |
|             URL url = new URL(china);
 | |
|             urlConnection = (HttpURLConnection) url.openConnection();
 | |
|             String read;
 | |
|             in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), StandardCharsets.UTF_8));
 | |
|             while ((read = in.readLine()) != null) {
 | |
|                 inputLine.append(read).append("\r\n");
 | |
|             }
 | |
|             //System.out.println(inputLine.toString());
 | |
|         } catch (IOException e) {
 | |
|             e.printStackTrace();
 | |
|         } finally {
 | |
|             try {
 | |
|                 if (in != null) in.close();
 | |
| 
 | |
|                 if (urlConnection != null) urlConnection.disconnect();
 | |
|             } catch (IOException e) {
 | |
|                 e.printStackTrace();
 | |
|             }
 | |
|         }
 | |
|         Pattern p = Pattern.compile("<dd class=\"fz24\">(.*?)</dd>");
 | |
|         Matcher m = p.matcher(inputLine.toString());
 | |
|         if (m.find()) {
 | |
|             ip = m.group(1);
 | |
|             //System.out.println(ip);
 | |
|         }
 | |
|         return ip;
 | |
|     }
 | |
| 
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 访问目标地址并获取返回值
 | |
|      *
 | |
|      * @param urlStr   请求的地址
 | |
|      * @param content  请求的参数 格式为:ip=192.168.1.101
 | |
|      * @param encoding 服务器端请求编码。如GBK,UTF-8等
 | |
|      */
 | |
|     public static String getResult(String urlStr, String content, String encoding) {
 | |
|         HttpURLConnection connection = null;
 | |
|         try {
 | |
|             URL url = new URL(urlStr);
 | |
|             connection = (HttpURLConnection) url.openConnection();// 新建连接实例
 | |
|             connection.setConnectTimeout(2000); // 设置连接超时时间,单位毫秒
 | |
|             connection.setReadTimeout(33000);   // 设置读取数据超时时间,单位毫秒
 | |
|             connection.setDoOutput(true); // 是否打开输出流 true|false
 | |
|             connection.setDoInput(true);  // 是否打开输入流true|false
 | |
|             connection.setRequestMethod("POST");// 提交方法POST|GET
 | |
|             connection.setUseCaches(false); // 是否缓存true|false
 | |
|             connection.connect(); // 打开连接端口
 | |
|             DataOutputStream out = new DataOutputStream(connection.getOutputStream()); // 打开输出流往对端服务器写数据
 | |
|             out.writeBytes(content); // 写数据,也就是提交你的表单 name=xxx&pwd=xxx
 | |
|             out.flush(); // 刷新
 | |
|             out.close(); // 关闭输出流
 | |
|             BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));
 | |
|             // 往对端写完数据对端服务器返回数据
 | |
|             // 以BufferedReader流来读取
 | |
|             StringBuilder buffer = new StringBuilder();
 | |
|             String line;
 | |
|             while ((line = reader.readLine()) != null) {
 | |
|                 buffer.append(line);
 | |
|             }
 | |
|             reader.close();
 | |
|             return buffer.toString();
 | |
|         } catch (IOException e) {
 | |
|             ErrorHelper.println(e);
 | |
|         } finally {
 | |
|             if (connection != null) {
 | |
|                 connection.disconnect(); // 关闭连接
 | |
|             }
 | |
|         }
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 弹框响应
 | |
|      *
 | |
|      * @param response 响应流
 | |
|      * @param data     显示内容
 | |
|      */
 | |
|     public static void outRespAlert(HttpServletResponse response, String data) {
 | |
|         response.setContentType("text/html; charset=UTF-8");
 | |
|         try {
 | |
|             PrintWriter out = response.getWriter();
 | |
| 
 | |
|             String returnVal = "";
 | |
|             returnVal += "<html>";
 | |
|             returnVal += "<head><title>提示</title></head>";
 | |
|             returnVal += "<body background-color=\"#fff\">";
 | |
|             returnVal += "<script msgInterface=\"text/javascript\">";
 | |
|             returnVal += "alert(\"" + data + "\");";
 | |
|             returnVal += "</script>";
 | |
|             returnVal += "</body></html>";
 | |
|             out.println(returnVal);
 | |
|         } catch (IOException ex) {
 | |
|             ex.printStackTrace();
 | |
|         }
 | |
|     }
 | |
| 
 | |
| //    /**
 | |
| //     * 响应success字符串
 | |
| //     *
 | |
| //     * @param resp 响应流
 | |
| //     */
 | |
| //    public static void respSuccess(HttpServletResponse resp) {
 | |
| //        outRespBytes(resp, "success");
 | |
| //    }
 | |
| //
 | |
| //    /**
 | |
| //     * 响应字节流
 | |
| //     *
 | |
| //     * @param resp     响应流
 | |
| //     * @param respData 响应数据
 | |
| //     */
 | |
| //    public static void outRespBytes(HttpServletResponse resp, String respData) {
 | |
| //        try (ServletOutputStream out = resp.getOutputStream()) {
 | |
| //            if (respData == null || "".equals(respData)) {
 | |
| //                respData = "success";
 | |
| //            }
 | |
| //            out.write(respData.getBytes(StandardCharsets.UTF_8));
 | |
| //            out.flush();
 | |
| //        } catch (Exception e) {
 | |
| //            ErrorHelper.println(e);
 | |
| //        }
 | |
| //    }
 | |
| 
 | |
| }
 | |
| 
 |