1

私はMojoliciousLiteを使用してアプリを作成しており、アクティブなセッションに関するすべてのデータを監視する方法を自分自身に提供したいと考えています。これは、Mojolicious Liteでのセッションを使用する最初の試みであり、内部で何が起こっているかを監視したいためです。

いくつかの注意事項:私がMojolicious Liteを使用しているという事実から推測できるように、私はMojoliciousを初めて使用します。私が以前に書いたMojoliciousLiteアプリはどれもかなり些細なものだったので、それについての私の知識は深くありません。さらに言えば、私はまだ「初期の中間、せいぜい」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));
};

私は、最初の2つのURLにアクセスした後、Mojoliciousがfirst_userとsecond_userについて知っていることを確認する「いくつかの」データをどこかに持っているという仮定に取り組んでいます。(Mojolicious Liteセッションの使用方法を完全に理解していない可能性もあります...正直なところ、ドキュメントからはよくわかりません。)

悲しいことに、/sessionsはMojolicious::Sessionsオブジェクトの内容を表示するだけです。

$ VAR1 = bless({'cookie_path' =>'/'、'secure' => 0、'cookie_name' =>'mojolicious'、'default_expiration' => 3600}、'Mojolicious :: Sessions');

しかし、どこかで、Mojoliciousが持っているすべてのセッション関連データのハッシュを取得できると思います。私はしばらくの間ドキュメントをざっと見てきましたが、まだリードを見つけていません。

何か洞察はありますか?

4

1 に答える 1

6

私は、最初の2つのURLにアクセスした後、Mojoliciousがfirst_userとsecond_userについて知っていることを確認する「いくつかの」データをどこかに持っているという仮定に取り組んでいます。(Mojolicious Liteセッションの使用方法を完全に理解していない可能性もあります...正直なところ、ドキュメントからはよくわかりません。)

ええ、あなたはセッションのポイントを逃していると思います。サーバー/アプリは、アクセスするすべてのユーザーの状態を記憶しているわけではありません。まるでそれがそうであるかのように見えるようにするために、私たちはクッキーを持っています。セッションは、クライアントごとの永続性です。

セッション情報は単なるハッシュリファレンスであり、JSONとしてエンコードされ、クライアント側のCookieに保存されます。これは、ユーザー名として、おそらくショッピングカートにあるもののarrayrefとしてログインしていることを思い出すのに役立ちます。ページをリクエストすると、この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すると、それはあなたの名前をクッキーに保存します。それ以降、訪問するたびに、次のよう/になるまで挨拶します。

  1. セッションの有効期限が切れます(デフォルトは最後の訪問から1時間)
  2. あなたは経由であなたの名前を変更します/name/whatever
  3. /logout手動でセッションを期限切れにするためにアクセスします

別のユーザー(別のコンピューターまたは同じコンピューター上の別のブラウザー)の名前が異なる場合がありますが、どちらも永続的です。それがセッションの目的です。:-)

于 2013-03-25T12:36:09.073 に答える