0

我在我的 Web 应用程序中使用 Perl CGI 和 Apache::Session。

使用 tie 设置 Apache::Session 时,如下所示:

tie %session, 'Apache::Session::MySQL', $id, {
    DataSource => 'dbi:mysql:apache_session', 
    UserName   => 'root',         
    Password   => '',           
    LockDataSource => 'dbi:mysql:apache_session',
    LockUserName   => 'root',
    LockPassword   => ''
};

如何捕获 $id 不是数据库中的有效会话时发生的错误?我需要创建一个新的会话 ID,而不是让应用程序因 500 http 错误而死掉。

当用户有一个过期的 cookie 时,会出现这种情况,该 cookie 的会话 ID 已从数据库中删除。

4

1 回答 1

1

如果$id变量的值为undef,则 Apache::Session 创建一个新的会话 ID。现在如果$id已定义但未在此处指定有效会话,则将引发异常。

你可以做到这一点的一种方法是包装tie在一个eval块中。

eval {
     tie %session, 'Apache::Session::MySQL', $id, {
         DataSource => 'dbi:mysql:apache_session', 
         UserName   => 'root',         
         Password   => '',           
         LockDataSource => 'dbi:mysql:apache_session',
         LockUserName   => 'root',
         LockPassword   => ''
     };
};

如果抛出异常,您可以检查消息是否表明会话无效。

if ( $@ ) { ... }
于 2013-09-08T21:36:23.027 回答