Spring 具有白名单地址的 TCP 消息服务器

Spring TCP messaging server with whitelist address

我正在使用 Spring 集成的 TcpNetServerConnectionFactoryTcpInboundGateway 来接收 TCP 消息。一切都按预期工作,但我想知道是否有任何方法可以实现地址白名单? (基本上我想允许一个指定的地址并拒绝来自其他地址的连接。)也许有一种方法可以在建立连接时向 accept/reject 添加回调,但我在文档或示例中找不到任何提及。

创建自定义 TcpNetConnectionSupport(子类 DefaultTcpNetConnectionSupport 并覆盖 createNewConnection())。

我想你应该可以关闭那里的套接字。

将其注入服务器连接工厂。

参见 Advanced Techniques

编辑

它是在 Spring 集成 5...

中添加的
@SpringBootApplication
public class So48951046Application {

    public static void main(String[] args) {
        SpringApplication.run(So48951046Application.class, args).close();
    }

    @Bean
    public ApplicationRunner runner() {
        return args -> {
            Socket socket = SocketFactory.getDefault().createSocket("localhost", 1234);
            Thread.sleep(10_000);
            socket = SocketFactory.getDefault().createSocket("localhost", 1234);
            Thread.sleep(10_000);
        };
    }

    @Bean
    public TcpNetServerConnectionFactory server() {
        TcpNetServerConnectionFactory server = new TcpNetServerConnectionFactory(1234);
        server.setTcpNetConnectionSupport(new DefaultTcpNetConnectionSupport() {

            @Override
            public TcpNetConnection createNewConnection(Socket socket, boolean server, boolean lookupHost,
                    ApplicationEventPublisher applicationEventPublisher, String connectionFactoryName)
                    throws Exception {
                TcpNetConnection conn = super.createNewConnection(socket, server, lookupHost, applicationEventPublisher, connectionFactoryName);
                if (conn.getHostAddress().contains("127")) {
                    conn.close();
                }
                return conn;
            }

        });
        return server;
    }

    @Bean
    public TcpReceivingChannelAdapter adapter() {
        TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
        adapter.setConnectionFactory(server());
        adapter.setOutputChannel(new NullChannel());
        return adapter;
    }

}

: server, port=1234 Listening
: Started So48951046Application in 0.907 seconds (JVM running for 1.354)
: Accepted connection from 127.0.0.1
: New connection localhost:63624:1234:b558c7ca-f209-41b1-b958-7d9844f4d478
: server: Added new connection: localhost:63624:1234:b558c7ca-f209-41b1-b958-7d9844f4d478
: localhost:63624:1234:b558c7ca-f209-41b1-b958-7d9844f4d478 Reading...
: server: Removed closed connection: localhost:63624:1234:b558c7ca-f209-41b1-b958-7d9844f4d478
: Read exception localhost:63624:1234:b558c7ca-f209-41b1-b958-7d9844f4d478 SocketException:Socket is closed
: Accepted connection from 127.0.0.1
: New connection localhost:63625:1234:50c7b774-522a-4c43-b111-555e76611a33
: server: Added new connection: localhost:63625:1234:50c7b774-522a-4c43-b111-555e76611a33
: server: Removed closed connection: localhost:63625:1234:50c7b774-522a-4c43-b111-555e76611a33
: localhost:63625:1234:50c7b774-522a-4c43-b111-555e76611a33 Reading...
: Read exception localhost:63625:1234:50c7b774-522a-4c43-b111-555e76611a33 SocketException:Socket is closed