我正在编写一个小应用程序,我使用Tornado websockets。我使用cookie进行身份验证,因此我想在建立Web套接字时进行检查。
所以这是挑战(建立在官方websockets示例上):
class EchoWebSocket(tornado.websocket.WebSocketHandler):
def open(self):
userx = self.get_secure_cookie("user")
if not userx:
self.send_error(403) #I want to redirect or otherwise stop the user
print "WebSocket opened"
def on_message(self, message):
userx = self.get_secure_cookie("user")
self.write_message(u"%s said: %s" % (userx, message))
def on_close(self):
print "WebSocket closed"
事实证明这对Tornado不太受欢迎,抛出了这个错误:
ERROR:root:Exception in callback <tornado.stack_context._StackContextWrapper object at 0x10fa10db8>
Traceback (most recent call last):
....
File "/Library/Python/2.7/site-packages/tornado-2.4-py2.7.egg/tornado/iostream.py", line 565, in _check_closed
raise IOError("Stream is closed")
IOError: Stream is closed
甚至可以在websockets握手期间“验证或取消”吗?这是我的代码的问题,还是Tornado存在问题/缺失功能? Tornado是否能够在websockets上发送一些错误条件以在这种情况下触发客户端的onerror处理程序(在手册中找不到任何强制错误条件的方法)?
我想要实现的一系列事件是:
用户使用常规Web请求登录,会话令牌存储为安全cookie
用户加载使用websockets的页面,javascript尝试建立套接字
我想检查是否存在有效的会话令牌
答案 0 :(得分:3)
您可以跟踪您的用户,您可以轻松完成,因为每个用户连接到服务器时都会创建一个实例,请查看此SO link。
关于你想要关闭连接,如果他没有经过身份验证,你可以通过在WebSWebSocketHandler实例中调用close()方法来实现它,如下所示:
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self):
if not condition:
self.close()
在Tornado中查看此内容:tornado.websocket.WebSocketHandler.WebSocketHandler.close()
我自己没试过。您可以尝试并告诉我它是否适合您。
答案 1 :(得分:1)
http://www.tornadoweb.org/documentation/web.html#tornado.web.RequestHandler.write_error
您可以覆盖handle.write_error
方法,但我不知道WebSocketHandler
是否包含此方法
答案 2 :(得分:0)
看起来这个问题的答案就像Nikolay Fominyh所建议的那样(虽然我不能接受答案,因为它的评论而不是答案)向用户发送消息并关闭连接。目前这似乎是解决这个问题的最佳方法。