Mojolicious::Plugin::SessionStore

简介

Mojolicious::Plugin::SesionStore是一个Mojolicious的session所在插件。

在Mojolicious框架在Mojolicious::Controller中已经提供了session管理的功能。并且提供了一个默认的session数据存储的模块Mojolicious::Sessions。只不过Mojolicious::Sessions是通过Cookie来存储session的。由于Cookie的尺寸限制,并且Cookie是在客户端存储的,使得在开发大型应用时在session的存储数据量和安全方面无法满足需求。再者就是大量session存储的客户端,每次请求都需要通过网络传输,对服务器带宽也有一定的消耗。

综上,在使用Mojolicious时无需要修改session管理的功能,如果对session的存储量较大且安全性要求较高,则只需要对session数据存储的功能进行扩展就可以了。

Mojolicious::Plugin::SessionStore就是这样一个,对Mojolicious框架中session数据存储进行扩展的插件。

实现机制

Mojolicious::Plugin::SessionStore是一个Mojolicious插件,它的register方法的源码如下所示:

sub register {
    my ( $self, $app, $args ) = @_;
    $args = { session_store => $args } unless ( ref $args eq 'HASH' );
    my $sessions  = Mojolicious::Sessions::Storable->new(%$args);
    $app->sessions($sessions);
    return $sessions;
}

由以上代码可知,这个插件仅是把Mojolicious框架默认的session数据存储模块(Mojolicious:Sessions)替换成了Mojolicious::Sessions::Storable对象。真正的session数据存储功能则由Mojolicious::Sessions::Storable模块实现。

Mojolicious::Sessions::Storable

Mojolicious::Sessions::Storable 类是Mojolicious::Sessions的一个子类。它重载了父类中的load和store方法。

属性

Mojolicious::Sessions::Storable继承了Mojolicious::Sessions中的所有属性,并实现以下属性。

session_store

提供session数据读取和存储功能的对象,这个对象的类需要实现与Plack::Session::Store模块相同的接口(需要包含方法:fetch,store,remove),目前可用的模块如下表:

模块名 功能 cpan
Plack::Session::Store::File 提供以文件读写形式存取session数据的模块 https://metacpan.org/pod/Plack::Session::Store::File
Plack::Session::Store::DBI 提供以数据库读写形式存取session数据的模块,需要提供一个数据库句柄 https://metacpan.org/pod/Plack::Session::Store::File
Plack::Session::Store::Cache 提供以Cache接口形式存取session数据的模块,需要提供一个实现了Cache接口的对象 https://metacpan.org/pod/Plack::Session::Store::Cache

除了以上列表中介绍的可用模块名,你还可以自己实现,稍候介绍在自己实现session_store对象时的注意事项。

sid_generator

用于生成会议唯一标识的 coderef 。默认情况下使用SHA1对当对rand() . $$ . {} . time求值。

方法

Mojolicious::Sessions::Storable 对其父类 Mojolicious::Sessions中的load和store方法进行了重载,使其具有了更强大的功能和可扩展性。除此之外,它还实现了一些方法(generate_id 、get_session、set_session)这些方法都是为load和store服务的。如果不自己编写存取session数据的模块(即session_store对象),可以不用了解这些方法;如果需要自己编写存取session数据的模块,则需要去理解这些方法的源码。所以在此就不做介绍了。

实现session_store

实现session_store对象也就是编写一个存取session数据的模块。前面介绍中说到,这个模块需要实现三个方法:fetch、store、remove;下面分别对这方法进行介绍。

fetch

这个方法接收一个参数:session_id;也就是session(会话)的唯一标识。他返回对这个session_id对应的所有session数据。

实现这个方法就是要用session的唯一标识,找到并返回与之对应的session数据。

store

这个方法接收两个参数:session_id,session_data;也就是session(会话)的唯一标识,和session数据。

实现这个方法就是把session数据与session的唯一标识对应着存储起来,以备将来使用。

remove

这个方法接收一个参数:session_id;也就是session(会话)的唯一标识。

实现这个方法就是要把参数指定的session唯一标识对应的所有session数据删除掉。

在session过期时,系统会自动调用这个方法。在一些业务场景中(如用户退出系统)则需要由用户代码调用,以删除用户的会话数据。

你可能感兴趣的:(Mojolicious::Plugin::SessionStore)