业务场景:
web页面做了一个功能,在websocket请求失败的情况,会定时向服务端进行重试进行建立连接。
存在的问题是即使这个web系统没人操作的情况下,只要页面没有关闭,即使系统超时了页面也没有发生跳转,这就有点像对服务器进行攻击一样。
问题分析:
经过分析,从上述描述的情况来看,有如下问题:
1、系统超时的时候,页面应该要一个跳转,例如跳转到登陆页面。如果这一步做了,也会减少websocket不断的向服务器发送请求,超时的情况下发送的websocket都是无效请求
2、在某种情况,websocket请求失败,想要重试再次建立连接,从想法上是没有问题的,但是问题的关键就在于没有阀值的控制,例如可以重试5次,如果发现还是连接不上,那么就终止重试请求
解决方案:
1、系统超时的时候,页面跳转到登陆页面就可以了。前端可以根据检测操作事件,根据时间来控制,如果超时了,那么就自动跳转。
2、重试次数控制,增加业务逻辑就可以了,也没有特别的。
3、因为这种不断的请求就会导致服务端很痛苦,尤其是那种系统超时过来的无效的请求。如果想要临时阻止这种情况,NGINX上是可以配置的。
1)、识别请求IP
可以到NGINX的日志文件中取查看,logs/access.log, 下面是摘出来一条日志:
192.0.79.100 - - [31/Jan/2024:11:39:34 +0800] "GET /prod-api/getRouters HTTP/1.0" 200 7495 "域名XXXX"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36" "192.0.79.10"
我从上面可以看出,请求来源于192.0.79.100
2)、配置想要阻止的请求地址
location / {
deny 192.0.79.100;
}
3)、重启NGINX
./nginx -s reload
4)、测试请求
当192.0.79.100机器再次往这个NGINX发起请求的时候,发现页面报错了,那么就代表以及成功阻拦了请求