在做自动过滤的时候我们经常会将并发访问量非常高的IP进行拉入黑名单,也就是拒绝访问处理,但是我们依然需要收集这些IP地址,那么我们今天就要用到这款代码了,这里是Java的版本我们先来看看,然后进行具体的测试体验:
package com.item.common;
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IpUtil {
public static String getIpAddr(HttpServletRequest request) {
String ipAddress = null;
try {
ipAddress = request.getHeader("x-forwarded-for");
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
if (ipAddress.equals("127.0.0.1")) {
// 根据网卡取本机配置的IP
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
ipAddress = inet.getHostAddress();
}
}
//这里IP地址的总长肯定是大于15的
if (ipAddress != null && ipAddress.length() > 15) {
if (ipAddress.indexOf(",") > 0) {
ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
}
}
} catch (Exception e) {
ipAddress = "";
}
return ipAddress;
}
}
调用的时候也是很简单的,不需要单独的传递参数:直接写入到参数中,即可使用,这里我放到了一个map中,一会咱们进行访问测试的时候就能看到了。
访问测试1:
这里我采用的是:【http://127.0.0.1:8080/GetInfo】访问方式,获取的地址是本地的IP地址。
工具使用的是Eolink,很方便的一款API工具,最近一直在用功能很多,在这里做个推荐。
实际返回内容:
访问方式2:
我们换一种访问方式,使用localhost来测试一下:
可以在地址上看到,我使用的是【http://localhost:8080/GetInfo】来访问的,但是返回的结果是【
0:0:0:0:0:0:0:1
】
那么0:0:0:0:0:0:0:1这个代表什么呢?
0:0:0:0:0:0:0:1是属于ipv6,但是本机又没有设置ipv6,后来我又进行另一台电脑做测试,发现这种情况只有在服务器和客户端都在同一台电脑上才会出现(例如用localhost访问的时候才会出现),原来是hosts配置文件的问题 windows的hosts文件路径:C:\Windows\System32\drivers\etc\hosts linux的host路径:/etc/hosts
这种方式是无法识别地址的,那么我们就会使用:
注释掉文件中的 # ::1 localhost 这一行即可解决问题。不过不起作用。 最有效的方式就是改变请求的ip,不要使用localhost:8080 使用127.0.0.1:8080或者ip:8080。
我们根据获取到相同IP的时间差进行判断是否是机器人,如果是机器人,那么我们可以直接禁用到这个IP地址。
屏蔽IP的方法:
一般我们都会使用nginx来处理封禁IP的任务,在 vhosts 目录下面,建一个屏蔽IP的文件,命名为banned_ip.conf,以后新增加屏蔽IP只需编辑这个文件即可。
加入以下内容即可:
deny 122.227.225.221;