简介
use Mojolicious::Sessions;
my $sessions = Mojolicious::Sessions->new;
$sessions->cookie_name('myapp');
$sessions->default_expiration(86400);
Mojolicious::Sessions是一个基于签名Cookie的会话管理器。
Mojolicious::Session根据Mojolicious的签名Cookie管理会话。所有数据都使用Mojo::JSON进行序列化,并在客户端上存储Base64编码,但使用HMAC-SHA1签名保护不受不必要的更改。
这种Session管理方式有如下缺点:
- 受cookie 尺寸的限制
- 虽然进行HMAC-SHA1签名保护,不会被客户端修改,但所有session数据信息依然会完全暴露给用户,安全性不好。
- 所有session数据在用户的每次请求中都会从客户端带到服务器端,再由服务器发给客户端,造成不必要的带宽和流量浪费。
基于以上缺点,如果要实现一个Web应用,最好使用 Mojolicious::Plugin::SessionStore插件对session数据存取功能进行扩展。
属性
Mojolicious::Sessions实现了以下属性。
cookie_domain
my $domain = $sessions->cookie_domain;
$sessions = $sessions->cookie_domain('.example.com');
session会话存储到的Cookie域,默认情况下是未定义的。
cookie_name
my $name = $sessions->cookie_name;
$sessions = $sessions->cookie_name('session');
session会话数据存储在Cookie中的名称,默认为mojolicious。
cookie_path
my $path = $sessions->cookie_path;
$sessions = $sessions->cookie_path('/foo');
session会话存储到的Cookie路径,默认情况下是/
。
default_expiration
my $time = $sessions->default_expiration;
$sessions = $sessions->default_expiration(3600);
会话在多久后过期(单位为秒),默认为3600。每次请求都会刷新过期。将期值设置为0,表示会话持续到浏览器窗口关闭,但这样做可能会存在安全隐患。为了更好的对session的过程时间进行控制你还可以直接设置expires的值。
# Expiration date in seconds from now (persists between requests)
$c->session(expiration => 604800);
# Expiration date as absolute epoch time (only valid for one request)
$c->session(expires => time + 604800);
# Delete whole session by setting an expiration date in the past
$c->session(expires => 1);
deserialize
my $cb = $sessions->deserialize;
$sessions = $sessions->deserialize(sub {...});
用于反序列化session数据的回调函数,默认为Mojo::JSON中的j函数。
$sessions->deserialize(sub {
my $bytes = shift;
return {};
});
secure
my $bool = $sessions->secure;
$sessions = $sessions->secure($bool);
在所有session存储到的cookie中设置安全标志,强制要求浏览器只通过https连接发送它们。
serialize
my $cb = $sessions->serialize;
$sessions = $sessions->serialize(sub {...});
用于序列化session数据的回调函数,默认为Mojo::JSON中的encode_json函数。
$sessions->serialize(sub {
my $hash = shift;
return '';
});
方法
Mojolicious::Sessions继承Mojo::Base中的所有方法,并实现以下方法。
load
$sessions->load(Mojolicious::Controller->new);
从已经签名的Cookie中加载session数据。
store
$sessions->store(Mojolicious::Controller->new);
将session数据存储到签名的cookie中。
网友评论