Socket.D v2.5.12

应用 - 鉴权

</> markdown

本协议要求通过 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"));
    }
}