netty4 ip过滤器的使用(可做ip黑名单处理)

netty4的ip过滤跟netty3的区别比较大。netty3的使用方法这里不介绍了,看看在netty4中怎么做ip的过滤。

从netty的文档中我们可以看到这么几个类:

https://netty.io/4.1/api/io/netty/handler/ipfilter/package-summary.html

netty4 ip过滤器的使用(可做ip黑名单处理)_第1张图片

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 {

	@Override
	public void initChannel(SocketChannel ch) throws Exception {
		ChannelPipeline pipeline = ch.pipeline();
		// ip过滤
		pipeline.addLast(new RuleBasedIpFilter(new IpFilterRuleHandler()));
	}

到此,netty4的ip过滤就完成了。

你可能感兴趣的:(netty)