Mina自带了一个黑名单过滤器BlacklistFilter,可过滤黑名单列表中的网络连接。用来防止非法的客户端访问。
但在某些应用场景里需要设定白名单,只接收某些指定IP的客户端发来的数据。这就需要实现白名单功能。
我们可以自己实现白名单过滤器,方法很简单只需仿照BlacklistFilter做些修改即可。
我自己写的WhiteFilter,代码如下:
/**
* Whitelist filter (based on Mina's Blacklist filter).
*/
public class WhitelistFilter extends IoFilterAdapter {
private final List<Subnet> whitelist = new CopyOnWriteArrayList<Subnet>();
private final static Logger LOGGER = LoggerFactory.getLogger(WhitelistFilter.class);
public void setWhitelist(InetAddress[] addresses) {
if (addresses == null) {
throw new NullPointerException("addresses");
}
whitelist.clear();
for (InetAddress addr : addresses) {
allow(addr);
}
}
public void setSubnetWhitelist(Subnet[] subnets) {
if (subnets == null) {
throw new NullPointerException("Subnets must not be null");
}
whitelist.clear();
for (Subnet subnet : subnets) {
allow(subnet);
}
}
public void setWhitelist(Iterable<InetAddress> addresses) {
if (addresses == null) {
throw new NullPointerException("addresses");
}
whitelist.clear();
for (InetAddress address : addresses) {
allow(address);
}
}
public void setSubnetWhitelist(Iterable<Subnet> subnets) {
if (subnets == null) {
throw new NullPointerException("Subnets must not be null");
}
whitelist.clear();
for (Subnet subnet : subnets) {
allow(subnet);
}
}
public void allow(InetAddress address) {
if (address == null) {
throw new NullPointerException("Adress to block can not be null");
}
allow(new Subnet(address, 32));
}
public void allow(Subnet subnet) {
if (subnet == null) {
throw new NullPointerException("Subnet can not be null");
}
whitelist.add(subnet);
}
public void disallow(InetAddress address) {
if (address == null) {
throw new NullPointerException("Adress to unblock can not be null");
}
disallow(new Subnet(address, 32));
}
public void disallow(Subnet subnet) {
if (subnet == null) {
throw new NullPointerException("Subnet can not be null");
}
whitelist.remove(subnet);
}
@Override
public void sessionCreated(NextFilter nextFilter, IoSession session) {
if (isAllowed(session)) {
nextFilter.sessionCreated(session);
} else {
blockSession(session);
}
}
@Override
public void sessionOpened(NextFilter nextFilter, IoSession session) throws Exception {
if (isAllowed(session)) {
nextFilter.sessionOpened(session);
} else {
blockSession(session);
}
}
@Override
public void sessionClosed(NextFilter nextFilter, IoSession session) throws Exception {
if (isAllowed(session)) {
nextFilter.sessionClosed(session);
} else {
blockSession(session);
}
}
@Override
public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) throws Exception {
if (isAllowed(session)) {
nextFilter.sessionIdle(session, status);
} else {
blockSession(session);
}
}
@Override
public void messageReceived(NextFilter nextFilter, IoSession session, Object message) {
if (isAllowed(session)) {
nextFilter.messageReceived(session, message);
} else {
blockSession(session);
}
}
@Override
public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
if (isAllowed(session)) {
nextFilter.messageSent(session, writeRequest);
} else {
blockSession(session);
}
}
private void blockSession(IoSession session) {
LOGGER.warn("Remote address is not allowed; closing.");
session.close(true);
}
private boolean isAllowed(IoSession session) {
SocketAddress remoteAddress = session.getRemoteAddress();
if (remoteAddress instanceof InetSocketAddress) {
InetAddress address = ((InetSocketAddress) remoteAddress).getAddress();
// check all subnets
for (Subnet subnet : whitelist) {
if (subnet.inSubnet(address)) {
return true;
}
}
}
return false;
}
}
调用时要加入whitelist过滤器
IoAcceptor acceptor = new NioSocketAcceptor();
WhitelistFilter whitelistFilter=new WhitelistFilter();
InetAddress[] address= new InetAddress[1];
address[0]=InetAddress.getByName("192.168.136.123");
whitelistFilter.setWhitelist(address);
acceptor.getFilterChain().addFirst("white",whitelistFilter);
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("GBK"))));
acceptor.setHandler(new ServerHandler());
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
acceptor.bind(new InetSocketAddress(PORT));
这样服务端只会从指定的IP接收数据,如果客户端使用其他的IP地址则服务端拒绝连接。
分享到:
相关推荐
Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)
Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个"apache-mina-2.0.4.rar"压缩包包含的是Apache Mina 2.0.4版本的源代码,是深入理解和定制Mina的...
Apache Mina是一个开源框架,主要用于构建高性能、高可用性的网络应用程序。这个压缩包包含了全面的学习资料,适合初学者深入理解Mina的原理和使用方法。其中,中文参考手册的加入使得学习过程更加友好,便于非英语...
"Apache Mina chm pdf教程和帮助文档"提供了详尽的API参考和实例,涵盖了从基本概念到高级特性的各个方面,有助于开发者快速掌握Mina的使用方法。 **7. 社区支持** Apache Mina作为一个活跃的开源项目,拥有强大的...
深入理解Apache_Mina_(1)----_Mina的几个类 深入理解Apache_Mina_(2)----_与IoFilter相关的几个类 深入理解Apache_Mina_(3)----_与IoHandler相关的几个类 深入理解Apache_Mina_(4)----_IoFilter和IoHandler的区别和...
你可以实现这些接口并覆盖相关方法来响应特定事件。 6. **服务启动和停止**:在Mina中,服务可以通过ServerBootstrap类配置并启动。你可以指定端口、线程池配置、协议处理类等参数。 7. **minaDemo项目结构**:...
Apache MINA FtpServer提供了一个可扩展且高效的FTP服务器实现,允许开发人员自定义认证机制、数据存储策略以及许多其他特性。 **FtpServer基本架构** Apache MINA FtpServer的核心组件包括服务器引擎、服务器端口...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,专为高性能、异步网络应用程序设计。MINA 提供了一套高级的网络通信抽象层,简化了开发过程,特别是对于处理TCP/IP和UDP/IP...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个开源框架,主要设计用于简化网络应用程序的开发,尤其是基于TCP和UDP协议的应用。它提供了高度可扩展和高性能的非阻塞I/O模型,使得...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发高质量的网络服务。这个框架适用于多种协议,如TCP/IP和UDP/IP,以及NIO(非...
开发者需要实现这个接口的`messageReceived`、`messageSent`、`sessionCreated`、`sessionClosed`等方法来响应不同的网络事件。 2. **ProtocolDecoder** 和 **ProtocolEncoder**: 这两个接口用于解码接收到的数据和...
在这个实例中,我们将深入探讨如何利用Apache Mina实现TCP的长连接和短连接。 首先,TCP(传输控制协议)是互联网上广泛使用的面向连接的协议,它保证了数据的可靠传输。TCP连接分为两种类型:长连接和短连接。 1....
### Apache MINA 2.0 用户指南:基础知识 #### 基础概念介绍 Apache MINA 2.0 是一款高性能且易于使用的网络应用程序框架,它简化了开发人员在网络编程方面的负担,允许开发者专注于应用程序的核心功能,而不是底层...
Apache MINA是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。 当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版...
Apache Mina是一个高度可扩展的网络通信框架,主要用于构建高性能、高并发的网络应用程序,如服务器端应用。它提供了一种简单而强大的编程模型,使得开发者可以专注于业务逻辑,而不是底层的网络通信细节。Spring...
### Apache MINA线程模型配置详解 #### 一、线程模型配置介绍 Apache MINA 是一个用于构建网络应用程序的高性能、高可靠性的框架。它提供了丰富的功能来简化网络编程,包括TCP/IP 和 UDP/IP 协议的支持。线程模型...
Apache Mina Server 2.0 是一款高性能、可扩展的网络通信框架,广泛应用于开发网络应用服务器,如TCP/IP和UDP服务。这个框架允许开发者用Java编写高效的网络应用程序,简化了网络编程的复杂性。Mina 2.0 版本在前一...
本项目“Android-基于Apache MINA进行封装实现Android APP作为服务器客户端进行通讯”正是利用MINA库来构建Android应用的网络通信功能。 Apache MINA的核心优势在于其非阻塞I/O(Non-blocking I/O)模型,这种模型...
这个例子是关于如何使用Apache Mina实现一个简单的服务端和客户端通信的示例。在这个案例中,`MinaTimeServer`是服务端程序,它负责监听客户端的连接请求,并发送时间信息;而`MinaClient`则是客户端程序,它连接到...