【问题标题】:How can I see all active sessions in a Mojolicious Lite app?如何在 Mojolicious Lite 应用程序中查看所有活动会话?
【发布时间】:2013-03-25 08:48:02
【问题描述】:

我正在使用 Mojolicious Lite 构建一个应用程序,并希望给自己一种方法来查看有关活动会话的所有数据。我这样做主要是因为这是我第一次尝试使用 Mojolicious Lite 会话,我想看看幕后发生了什么。

几个注意事项: 我对 Mojolicious 还是很陌生,你可能会猜到我使用的是 Mojolicious Lite。我之前编写的任何 Mojolicious Lite 应用程序都很简单,所以我对它的熟悉程度并不深。 就此而言,我仍然是 perl 的“早期中级,充其量”,因此在 perl 中探索任何 OO 的内部工作原理对我来说基本上是陌生的领域。

也就是说,我给自己做了几条这样的小路线:

get '/firstpage' => sub{
    my $self = shift;
    my $usr = $self->session(user => 'first_user');
    $self->render(text => $usr);
};

get '/secondpage' => sub{
    my $self = shift;
    my $usr = $self->session(user => 'second_user');
    $self->render(text => $usr);
};

get '/sessions' => sub{
    my $self = shift;
    $self->render(text => Dumper(app->sessions));
};

我正在假设,在我访问前两个 url 之后,Mojolicious 将在某处拥有“一些”数据,以确认它知道 first_user 和 second_user。 (我也可能完全不了解如何使用 Mojolicious Lite 会话……老实说,从文档来看,我不太确定。)

遗憾的是,/sessions 只显示了 Mojolicious::Sessions 对象的内容:

$VAR1 = 祝福({ 'cookie_path' => '/', '安全' => 0, 'cookie_name' => 'mojolicious', 'default_expiration' => 3600 }, 'Mojolicious::Sessions' );

但我假设,在某个地方,我可以得到 Mojolicious 拥有的所有与会话相关的数据的哈希值。我已经在文档中搜索了一段时间,但还没有找到任何线索。

有什么见解吗?

【问题讨论】:

    标签: perl mojolicious


    【解决方案1】:

    我正在假设,在我访问前两个 url 之后,Mojolicious 将在某处拥有“一些”数据,以确认它知道 first_user 和 second_user。 (我也可能完全不了解如何使用 Mojolicious Lite 会话……老实说,从文档来看,我不太确定。)

    是的,我认为你错过了会议的重点。服务器/应用程序不会记住每个访问用户的状态。为了让它看起来好像确实如此,我们有 cookie。会话是每个客户端的持久性事物。

    会话信息只是一个哈希引用,编码为 JSON 并存储在客户端的 cookie 中。这对于记住您已登录很有用,例如用户名,可能是购物车中事物的数组引用。当您请求页面时,此 cookie 会被发送回服务器,服务器可以访问数据并准备响应,以便您了解会话的状态。

    因此没有“活动会话”的记录。所有这些信息都分布在所有客户之间。

    如果您想更好地了解正在发生的事情,我可以推荐 tempire 的插件 Mojolicious::Plugin::ConsoleLogger,它针对当前请求显示了所有相关信息(会话、存储等)您浏览器的 javascript 控制台。

    这是一个例子。

    #!/usr/bin/env perl
    
    use Mojolicious::Lite;
    
    #plugin 'ConsoleLogger'; # if desired
    
    any '/' => sub {
      my $self = shift;
      my $name = $self->session('name') || 'Unknown'; # get the name from the session
      $self->render( text => "Hello $name" );
    };
    
    any '/name/:name' => sub {
      my $self = shift;
      my $name = $self->stash('name'); # get name from path
      $self->session( name => $name ); # and store it in the session
      $self->redirect_to('/');
    };
    
    any '/logout' => sub {
      my $self = shift;
      $self->session( expires => 1 );
      $self->redirect_to('/');
    }; 
    
    app->start;
    

    如果您访问/name/ghorahn,它会将您的姓名存储在 cookie 中。从此以后,每次你访问/,它都会和你打招呼,直到:

    1. 您的会话到期(默认为您上次访问后的 1 小时)
    2. 您通过/name/whatever 更改您的姓名
    3. 您访问/logout 手动使会话过期

    您会注意到另一个用户(在另一台计算机上,甚至在同一台计算机上的不同浏览器上)可能有不同的名称,但两者都是持久的。这就是会话的用途。 :-)

    【讨论】:

    • 是的,我一直不清楚会话在后端持久性中的作用。我在想 Mojolicious 会跟踪其中的一些……但听起来 Mojolicious 只是处理每页加载的“你是谁?”这样我就可以使用该身份来查找我写入应用程序的任何持久数据。我会研究 ConsoleLogger ......听起来就像我想看到的那种东西。谢谢!
    • 您可以将 4k 的数据写入 cookie,因此您可以在会话中存储相当多的数据。此外,由于它已签名,您甚至可以存储诸如“登录用户名”之类的内容,并且由于客户端无法更改它,因此可以放心信任。享受吧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2019-06-11
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2014-05-21
    相关资源
    最近更新 更多