在服务端初始化的时候进行白名单的配置
@Component
public class SocketServerInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
//ip白名单
IpSubnetFilterRule rule = new IpSubnetFilterRule("132.122.233.156", 32 , IpFilterRuleType.ACCEPT);
IpSubnetFilterRule rule1 = new IpSubnetFilterRule("127.0.0.1", 32 , IpFilterRuleType.ACCEPT);
IpFilterRule rejectAll = new IpFilterRule() {
@Override
public boolean matches(InetSocketAddress inetSocketAddress) {
return true;
}
@Override
public IpFilterRuleType ruleType() {
return IpFilterRuleType.REJECT;
}
};
RuleBasedIpFilter ipFilter = new RuleBasedIpFilter(rule1,rule,rejectAll);
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addLast(new ObjectDecoder(10 * 1024 * 1024, ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader())));
pipeline.addLast(new ObjectEncoder());
//心跳检测设置
pipeline.addLast(new IdleStateHandler(60,0,0, TimeUnit.SECONDS));
pipeline.addLast(new SocketServerHandler());
//同一个Ip只能有一个连接
pipeline.addLast(new UniqueIpFilter());
//ip白名单
pipeline.addLast("ipFilter",ipFilter);
}
}
因为写在代码里后续维护不方便,然后我就放配置文件
@Component
public class SocketServerInitializer extends ChannelInitializer<SocketChannel> {
@Value("${netty.whiteList}")
private String whiteList;
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
//ip白名单
IpFilterRule rejectAll = new IpFilterRule() {
@Override
public boolean matches(InetSocketAddress inetSocketAddress) {
String ip = inetSocketAddress.getHostString();
return !whiteList.contains(ip);
}
@Override
public IpFilterRuleType ruleType() {
return IpFilterRuleType.REJECT;
}
};
RuleBasedIpFilter ipFilter = new RuleBasedIpFilter(rejectAll);
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addLast(new ObjectDecoder(10 * 1024 * 1024, ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader())));
pipeline.addLast(new ObjectEncoder());
//心跳检测设置
pipeline.addLast(new IdleStateHandler(60,0,0, TimeUnit.SECONDS));
pipeline.addLast(new SocketServerHandler());
//同一个Ip只能有一个连接
pipeline.addLast(new UniqueIpFilter());
//ip白名单
pipeline.addLast("ipFilter",ipFilter);
}
}
通过注解@RefreshScope可以动态刷新