session - 如何从 Dart HttpServer WebSocket 访问 HttpSession 数据?

标签 session websocket dart

我有一个非常简单的 WebSocket 服务器:

class WsServer {
  WsServer();

  void runServer(int port) {
    ConnectionsHandler connectionsHandler = new ConnectionsHandler();

    HttpServer
      .bind('127.0.0.1', port)
      .then((HttpServer server) {
        print('listening for connections on $port');

        var sc = new StreamController();
        sc.stream.transform(new WebSocketTransformer()).listen(connectionsHandler.onConnection);

        server.listen((HttpRequest request) {
          if (request.uri.path == '/ws') {
            sc.add(request);
          }
          // we dont deal static files
        });
      },
      onError: (error) => print("Error starting HTTP server: $error"));
  }
}

class ConnectionsHandler {
  List<WebSocket> connections = new List<WebSocket>();

  ConnectionsHandler();

  void onConnection(WebSocket conn) {
    print('new ws conn');
    connections.add(conn);
    conn.listen(
      onMessage,
      onDone: () => connections.remove(conn),
      onError: (e) => connections.remove(conn)
    );
  }

  void onMessage(message) {
    print('new ws msg: $message');
  } 
}

我需要在ConnectionsHandler中获取request.sessionWebSocketTransformer 似乎仅发送WebSocket 连接,该连接无法通过 session 访问原始HttpRequest

有没有办法从 websocket 处理程序本身访问 session 数据?即使客户端从 cookie 发送 dart session id,那么如何检索和刷新 HttpSession?

最佳答案

您也许可以让它工作,但如果 Web 套接字连接使用与普通 HTTP 请求相同的源,您只能看到 cookie,从而看到 session 。

请注意,WebSocketTransformer 不必在流中使用。您一次可以升级一个请求。

你能试试下面的代码吗?

import 'dart:io';
import 'dart:async';

class WsServer {
  WsServer();

  void runServer(int port) {
    ConnectionsHandler connectionsHandler = new ConnectionsHandler();

    HttpServer
      .bind('127.0.0.1', port)
      .then((HttpServer server) {
        print('listening for connections on $port');
        var connHandler = new ConnectionsHandler();
        var webSocketTransformer = new WebSocketTransformer();

        server.listen((HttpRequest request) {
          if (request.uri.path == '/ws') {
            webSocketTransformer.upgrade(request)
              .then((WebSocket ws) {
                connHandler.onConnection(ws, request);
              });
            // TODO handle error from update
          }
          // we dont deal static files
        });
      },
      onError: (error) => print("Error starting HTTP server: $error"));
  }
}

class ConnectionsHandler {
  List<WebSocket> connections = new List<WebSocket>();

  ConnectionsHandler();

  void onConnection(WebSocket conn, HttpRequest req) {
    print('new ws conn');
    connections.add(conn);
    conn.listen(
      (message) {
        print('new ws msg: $message and ${req.session.keys}');
      },
      onDone: () => connections.remove(conn),
      onError: (e) => connections.remove(conn)
    );
  }
}

main() {
  var server = new WsServer();
  server.runServer(3000);
}

关于session - 如何从 Dart HttpServer WebSocket 访问 HttpSession 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16042953/

相关文章:

php - 使用 php session 搜索数据库不会返回任何结果或错误

html - Node js - socket.io - 链接样式表未加载...端口问题?

php - 根据 WooCommerce 中的自定义结帐单选按钮和文本字段设置动态费用

sql - 设置 session 授权和搜索路径

html5 WebSocket

java - 是否可以在没有jetty,tomcat,...的情况下在java中打开websocket?

android-studio - Flutter Doctor 发现问题 Android_Home

flutter - 如果覆盖 `==`,则覆盖 `hashCode`

user-interface - 如何在 flutter 的标签栏后面添加阴影?

java - Tomcat:为 1 个请求多次设置 cookie 值?