码迷,mamicode.com
首页 > 其他好文 > 详细

socketIO拒绝连接后防止心跳(反复)重连

时间:2020-05-18 18:52:48      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:connect   new   conf   中间   code   ati   src   size   www   

  • 场景

  创建SocketIOServer时利用 isAuthorized 做了身份验证,当验证失败时返回false,虽然服务并没有建立起来,但是前端会不断进行轮询,从而造成一定的资源浪费。

@Bean
    public SocketIOServer socketIOServer() {
        Configuration config = new Configuration();
        config.setHostname(host);
        config.setPort(port);
        config.setAuthorizationListener(new AuthorizationListener() {
            @Override
            public boolean isAuthorized(HandshakeData data) {
                //TODO 该处可以用来进行身份验证
                log.info("id【"+data.getSingleUrlParam("id")+"】正在进行连接");
                return ("1").equals(data.getSingleUrlParam("id"))? false : true;
            }
        });
        return new SocketIOServer(config);
    }
17:20:46.676  INFO 22704 --- [ntLoopGroup-5-6] c.e.socketdemo.SocketdemoApplication     : id【1】正在进行连接
17:20:47.940  INFO 22704 --- [ntLoopGroup-5-7] c.e.socketdemo.SocketdemoApplication     : id【1】正在进行连接
17:20:49.774  INFO 22704 --- [ntLoopGroup-5-8] c.e.socketdemo.SocketdemoApplication     : id【1】正在进行连接
17:20:54.783  INFO 22704 --- [ntLoopGroup-5-9] c.e.socketdemo.SocketdemoApplication     : id【1】正在进行连接
17:21:00.098  INFO 22704 --- [tLoopGroup-5-10] c.e.socketdemo.SocketdemoApplication     : id【1】正在进行连接
17:21:05.108  INFO 22704 --- [tLoopGroup-5-11] c.e.socketdemo.SocketdemoApplication     : id【1】正在进行连接
17:21:10.419  INFO 22704 --- [tLoopGroup-5-12] c.e.socketdemo.SocketdemoApplication     : id【1】正在进行连接
17:21:15.429  INFO 22704 --- [tLoopGroup-5-13] c.e.socketdemo.SocketdemoApplication     : id【1】正在进行连接
  • 解决思路

  从问题的表象看,造成这个情况的原因是前端没有关闭socket连接服务,由于socket服务并没有建立,JAVA不存在可操作的对象,因此只能限定前端只进行一次握手尝试,或者被拒绝后关闭socket服务。

技术图片

  • 解决方案

  后来在https://www.w3cschool.cn/socket/socket-k49j2eia.html里找到了这样一段代码

socket.on(‘connect_error‘, (error) => {
  // ...
});

  完善后

socket.on(‘connect_error‘, (error) => {
  socket.close();
});

  实测问题得到解决:

17:43:32.339  INFO 22704 --- [tLoopGroup-5-11] c.e.socketdemo.SocketdemoApplication     : id【1】正在进行连接
17:43:47.625  INFO 22704 --- [tLoopGroup-5-13] c.e.socketdemo.SocketdemoApplication     : id【2】正在进行连接

  可以看到 "1" 并没有下像之前一样每隔几秒就进行一次尝试。

  • 拓展

  随着握手失败的测试增加,socket每次心跳的时间也会延长,但即使是延长 依然是在10秒内进行频繁请求。大部分项目的身份权限验证都是要连接数据库进行的,所以除了从前端进行努力, 也可以使用中间件进行非法用户的记录,然后直接拒绝。

 

 

  如果有更好的方式,请联系交流。

socketIO拒绝连接后防止心跳(反复)重连

标签:connect   new   conf   中间   code   ati   src   size   www   

原文地址:https://www.cnblogs.com/donglinblog/p/12912055.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!