码神之路:Perl篇

Mojolicious::Sessions

2017-10-17  本文已影响19人  JSON_NULL

简介

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管理方式有如下缺点:

  1. 受cookie 尺寸的限制
  2. 虽然进行HMAC-SHA1签名保护,不会被客户端修改,但所有session数据信息依然会完全暴露给用户,安全性不好。
  3. 所有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中。

上一篇 下一篇

猜你喜欢

热点阅读