netty4的ip过滤跟netty3的区别比较大。netty3的使用方法这里不介绍了,看看在netty4中怎么做ip的过滤。
从netty的文档中我们可以看到这么几个类:
https://netty.io/4.1/api/io/netty/handler/ipfilter/package-summary.html
ip过滤相关的类在 io.netty.handler.ipfilter这个包中,本质也是netty的一个handler。
这里我们主要用到两个类:ipFilterRule 、RuleBasedIpFilter
前者是ip过滤的规则,后者是一个实现类。
当然这里就不多介绍这两个类了,这两个类很简单,一看就懂,我们这里直接看怎么使用吧。
1、首先我们创建一个实体类,用来配置ip段:
public class IpRange {
// 开始ip
private String ipStart;
// 结束ip
private String ipEnd;
//构造方法
public IpRange(String ipStart, String ipEnd) {
this.ipStart = ipStart;
this.ipEnd = ipEnd;
}
public String getIpStart() {
return ipStart;
}
public String getIpEnd() {
return ipEnd;
}
}
2、创建一个实现类实现IpFilterRule接口,用来配置过滤规则,可以根据自己的规则改造,这里只是一个示例:
/**
*
* Ip过滤器
*
* @author gogym
* @version 2019年7月13日
* @see IpFilterRuleHandler
* @since
*/
public class IpFilterRuleHandler implements IpFilterRule {
@Override
public boolean matches(InetSocketAddress remoteAddress) {
//ip转成long类型
String ip = remoteAddress.getHostString();
long ipLong = NetWorkUtil.ipToLong(ip);
//创建一个要过滤的ip段
IpRange ipRange = new IpRange("172.31.1.81", "172.31.1.87");
long ipStart = NetWorkUtil.ipToLong(ipRange.getIpStart());
long ipEnd = NetWorkUtil.ipToLong(ipRange.getIpEnd());
//比较ip区间
if (ipLong >= ipStart && ipLong <= ipEnd) {
//返回true则执行过滤器
return true;
}
//返回false表示不执行过滤器
return false;
}
@Override
public IpFilterRuleType ruleType() {
//返回拒绝则表示拒绝连接,反之返回接受则表示可以连接
return IpFilterRuleType.REJECT;
}
}
3、添加到netty配置中:
/**
* netty处理器配置
*
* @author kokJuis
* @version 1.0
* @date 2016-9-30
*/
public class ServerInitializer extends ChannelInitializer<SocketChannel> {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
// ip过滤
pipeline.addLast(new RuleBasedIpFilter(new IpFilterRuleHandler()));
}
到此,netty4的ip过滤就完成了。