应用 - 鉴权
本协议要求通过 Url 进行连接,连接时还可带上 MetaString。这个,就像 Http 和 Websocket(有 url ,还有 header)。UrlQueryString 和 MetaString,会成为接收端的会话参数(Session::param)。在监听器的 onOpen 事件,可对 Session 进行校验。进而实现鉴权。
1、客户端
- 基于 Url 签权
//创建会话(单例)
const clientSession = await SocketD.createClient("sd:ws://127.0.0.1:8602/?u=a&p=2")
.open();
- 也可以使用连接元信息(MetaString)
//创建会话(单例)
const clientSession = await SocketD.createClient("sd:ws://127.0.0.1:8602/")
.config(c => c.metaPut("u","noear").metaPut("p","2"))
.open();
- 还可以在连接时修改元信息(MetaString)
//创建会话(单例)
const clientSession = await SocketD.createClient("sd:ws://127.0.0.1:8602/")
.connectHandler(con => {
//每次连接时,可修改元信息
con.getConfig().metaPut("u", "noear").metaPut("p", "2");
return con.connect();
})
.open();
2、服务端(以 java 为例)
服务端可以在连接时通过 outMeta 输出 MetaString,让客户端的 Session::param 获取。
public class Demo {
public static void main(String[] args) throws Throwable {
//::启动服务端
SocketD.createServer("sd:tcp")
.config(c -> c.port(8602))
.listen(new SimpleListener() {
@Override
public void onOpen(Session session) throws IOException {
String user = session.param("u");
if ("noear".equals(user) == false) { //如果不是 noear,关闭会话
session.close();
}
//还可以添加握手输出
session.handshake().outMeta("server-ver","1");
}
@Override
public void onMessage(Session session, Message message) throws IOException {
System.out.println(message);
}
})
.start();
Thread.sleep(1000); //等会儿,确保服务端启动完成
//::打开客户端会话
//会成功
ClientSession clientSession1 = SocketD.createClient("sd:tcp://127.0.0.1:8602/?u=noear&p=2").open();
clientSession1.send("/demo", new StringEntity("hi"));
//会失败
ClientSession clientSessio2 = SocketD.createClient("sd:tcp://127.0.0.1:8602/?u=solon&p=1").open();
clientSessio2.send("/demo2", new StringEntity("hi"));
}
}