简介
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过期时,系统会自动调用这个方法。在一些业务场景中(如用户退出系统)则需要由用户代码调用,以删除用户的会话数据。