|
@@ -0,0 +1,118 @@
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+package com.caimei.module.pay.util;
|
|
|
+
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.util.Random;
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>Title: IPUtil</p>
|
|
|
+ * <p>Description: </p>
|
|
|
+ * <p>Company: caimei365</p>
|
|
|
+ * @author dmeng
|
|
|
+ * @date 2016年9月13日 下午5:20:18
|
|
|
+ */
|
|
|
+public class IPUtil {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取访问者IP
|
|
|
+ * 在一般情况下使用Request.getRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效。
|
|
|
+ * 本方法先从Header中获取X-Real-IP,如果不存在再从X-Forwarded-For获得第一个IP(用,分割),
|
|
|
+ * 如果还不存在则调用Request .getRemoteAddr()。
|
|
|
+ * @param request
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getIpAddr(HttpServletRequest request) throws Exception {
|
|
|
+ String ip = request.getHeader("X-Real-IP");
|
|
|
+ if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
|
|
|
+ return ip;
|
|
|
+ }
|
|
|
+ ip = request.getHeader("X-Forwarded-For");
|
|
|
+ if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
|
|
|
+ // 多次反向代理后会有多个IP值,第一个为真实IP。
|
|
|
+ int index = ip.indexOf(',');
|
|
|
+ if (index != -1) {
|
|
|
+ return ip.substring(0, index);
|
|
|
+ } else {
|
|
|
+ return ip;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return request.getRemoteAddr();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 从crm 转移过来
|
|
|
+ * 2018.5.24
|
|
|
+ * @param request
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getRemoteAddr(HttpServletRequest request) {
|
|
|
+ // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
|
|
|
+ String ip = request.getHeader("X-Forwarded-For");
|
|
|
+ if (ip == null) {
|
|
|
+ ip = request.getHeader("X-Real-IP");
|
|
|
+ if (ip == null) {
|
|
|
+ ip = request.getRemoteAddr();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (ip.length() > 15) {
|
|
|
+ String[] ips = ip.split(",");
|
|
|
+ for (int index = 0; index < ips.length; index++) {
|
|
|
+ String strIp = (String) ips[index];
|
|
|
+ if (!("unknown".equalsIgnoreCase(strIp))) {
|
|
|
+ ip = strIp;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ip;
|
|
|
+ }
|
|
|
+
|
|
|
+ /****************************java 随机获取国内IP*********************
|
|
|
+ 参考:http://www.oschina.net/code/snippet_252582_21129
|
|
|
+ 参考:http://bbs.csdn.net/topics/80096108
|
|
|
+ ******************************************************************/
|
|
|
+ /**
|
|
|
+ * 随机生成国内IP地址
|
|
|
+ */
|
|
|
+ public static String getRandomIp(){
|
|
|
+
|
|
|
+ //ip范围
|
|
|
+ int[][] range = {{607649792,608174079},//36.56.0.0-36.63.255.255
|
|
|
+ {1038614528,1039007743},//61.232.0.0-61.237.255.255
|
|
|
+ {1783627776,1784676351},//106.80.0.0-106.95.255.255
|
|
|
+ {2035023872,2035154943},//121.76.0.0-121.77.255.255
|
|
|
+ {2078801920,2079064063},//123.232.0.0-123.235.255.255
|
|
|
+ {-1950089216,-1948778497},//139.196.0.0-139.215.255.255
|
|
|
+ {-1425539072,-1425014785},//171.8.0.0-171.15.255.255
|
|
|
+ {-1236271104,-1235419137},//182.80.0.0-182.92.255.255
|
|
|
+ {-770113536,-768606209},//210.25.0.0-210.47.255.255
|
|
|
+ {-569376768,-564133889}, //222.16.0.0-222.95.255.255
|
|
|
+ };
|
|
|
+
|
|
|
+ Random rdint = new Random();
|
|
|
+ int index = rdint.nextInt(10);
|
|
|
+ String ip = num2ip(range[index][0]+new Random().nextInt(range[index][1]-range[index][0]));
|
|
|
+ return ip;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 将十进制转换成ip地址
|
|
|
+ */
|
|
|
+ public static String num2ip(int ip) {
|
|
|
+ int [] b=new int[4] ;
|
|
|
+ String x = "";
|
|
|
+
|
|
|
+ b[0] = (int)((ip >> 24) & 0xff);
|
|
|
+ b[1] = (int)((ip >> 16) & 0xff);
|
|
|
+ b[2] = (int)((ip >> 8) & 0xff);
|
|
|
+ b[3] = (int)(ip & 0xff);
|
|
|
+ x=Integer.toString(b[0])+"."+Integer.toString(b[1])+"."+Integer.toString(b[2])+"."+Integer.toString(b[3]);
|
|
|
+
|
|
|
+ return x;
|
|
|
+ }
|
|
|
+}
|