Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl mojoliciouswebsocket中的访问会话_Perl_Websocket_Mojolicious - Fatal编程技术网

Perl mojoliciouswebsocket中的访问会话

Perl mojoliciouswebsocket中的访问会话,perl,websocket,mojolicious,Perl,Websocket,Mojolicious,在Mojolicious::Lite中,有没有办法访问websocket请求中的会话,如下所示 get '/' => sub { my $self = shift; $self->session->{foo} = 'bar'; $self->render('index'); }; websocket '/ws' => sub { my $self = shift; $self->on(message => sub {

在Mojolicious::Lite中,有没有办法访问websocket请求中的
会话
,如下所示

get '/' => sub {
  my $self = shift;
  $self->session->{foo} = 'bar';
  $self->render('index');
};

websocket '/ws' => sub {
  my $self = shift;
  $self->on(message =>
    sub {
      my ($self, $msg) = @_;
      my $foo = $self->session->{foo}; # <<<<< is actually empty
    }
  );
};
get'/'=>sub{
我的$self=shift;
$self->session->{foo}='bar';
$self->render('index');
};
websocket'/ws'=>sub{
我的$self=shift;
$self->on(消息=>
潜艇{
我的($self,$msg)=@;

我的$foo=$self->session->{foo};#我最终将已签名的cookie值存储在一个隐藏的div中,然后将其与每个WS消息一起作为“协议”的一部分发送。在消息处理程序中,我检查cookie值是否存在,检查cookie值的签名,然后base64解码并像往常一样使用它,如下所示:

    sub decode_cookie {
      my ($self, $cookie_val) = @_;
      my $json = Mojo::JSON->new();
      my $secret = $self->stash->{'mojo.secret'};
      if ($cookie_val =~ s/--([^\-]+)$//) {
        my $sig = $1;
        #app->log->debug("cookie=".$cookie_val);
        #app->log->debug("sig=".$sig);
        my $check = Mojo::Util::hmac_sha1_sum $cookie_val, $secret;
        unless(Mojo::Util::secure_compare $sig, $check) {
          app->log->warn("invalid session cookie signature");
          return;
        }
      } else {
          app->log->warn("failed to extract cookie value");
          return;
      }
      my $session = $json->decode(Mojo::Util::b64_decode($cookie_val));
      unless($session) {
          app->log->warn("failed to b64-decode session cookie");
          return;
      }
      return $session;
    }

    websocket '/rtc' => sub {
      my $self = shift;
      my $json = Mojo::JSON->new;

      $self->on(message =>
        sub {
          my ($self, $data) = @_;
          app->log->debug("received WS message: ".$data);
          $data = $json->decode($data);

          my $session = decode_cookie($self, $data->{cval});
          # do whatever you have to here...
        }
      );

我也遇到过这个问题。我不确定这是否可能。可能是在上提交了一个bug?在发布到这里之前,我已经在他们的邮件列表上询问过了,但从未得到回复。我最终将签名的cookie值存储在一个隐藏的div中,然后将其作为“协议”的一部分与每个WS-message一起发送。在消息处理程序中,我检查cookie值是否存在,检查它的签名,然后base64解码并像往常一样使用它。