WebSocket服务端指定URL路径不生效,如何限制仅指定路径可连接
问题原因
- 你使用的
websockets库的serve方法默认会监听当前端口下所有路径的WebSocket连接请求,全部转发给你注册的web_server处理函数 - 你的处理逻辑里完全没有用到函数传入的
path参数做路径校验,不管请求路径是/还是/websocket,都会执行相同的消息推送逻辑,自然两种情况都能连接成功、返回内容一致。
解决方法
在web_server处理函数的最开头加入路径校验逻辑,如果请求路径不符合要求,直接关闭WebSocket连接即可,修改后的服务端代码如下:
import asyncio import json import websockets # 此处补充你原有代码缺失的sub对象定义,实际使用时替换为你自己的业务逻辑即可 sub = type('Sub', (), {'status': {'data': '测试消息'}})() async def web_server(websocket, path): # 新增路径校验逻辑 if path != '/websocket': # 路径不符合直接关闭连接,1008为标准关闭码代表政策不允许,也可自定义原因 await websocket.close(code=1008, reason="仅支持/websocket路径连接") return # 原有业务逻辑保持不变 while True: publish_to_client = json.dumps(sub.status) await websocket.send(publish_to_client) await asyncio.sleep(0.1) if __name__ == "__main__": start_server = websockets.serve(web_server, "111.111.11.111", 8080) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever()
修改完成后,客户端如果使用不带/websocket的地址发起请求,会直接被服务端拒绝连接,只有路径完全匹配的请求才能正常建立连接、接收服务端推送的消息。
内容的提问来源于stack exchange,提问作者Ky P
相关产品推荐
相关产品推荐

