Socket.D v2.5.12

应用 - 鉴权

</> markdown

本协议要求通过 Url 进行连接,连接时还可带上 MetaString。这个,就像 Http 和 Websocket(有 url ,还有 header)。UrlQueryString 和 MetaString,会成为接收端的会话参数(Session::param)。在监听器的 onOpen 事件,可对 Session 进行校验。进而实现鉴权。

1、客户端

  • 基于 Url 签权
//会成功
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"));
  • 也可以使用连接元信息(MetaString)
ClientSession clientSession = SocketD.createClient("sd:tcp://127.0.0.1:8602/")
    .config(c->c.metaPut("u","noear").metaPut("p","2"))
    .open();
  • 还可以在连接时修改元信息(MetaString)
//创建会话(单例)
ClientSession clientSession = SocketD.createClient("sd:ws://127.0.0.1:8602/")
        .connectHandler(con -> {
            //每次连接时,可修改元信息
            con.getConfig().metaPut("u", "noear").metaPut("p", "2");
            return con.connect();
        })
        .open();

2、服务端

服务端可以在连接时通过 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();
                        } else {
                            //还可以添加握手输出
                            session.handshake().outMeta("server-ver","1");
                        }
                    }

                    @Override
                    public void onMessage(Session session, Message message) throws IOException {
                        System.out.println(message);
                    }
                })
                .start();
    }
}