首页 > 解决方案 > 使用该会话的脚本未更新会话数据

问题描述

认为我已经缩小了问题的范围,这是一个更好的问题。

我的脚本“索引”打开了一个现有会话 - 因为会话从登录脚本创建时就存在。

它确实在页面输出中正确使用了该会话的值,因此很明显,它从内存或服务器的 session_storage 目录访问会话。

编写脚本是为了向会话添加两个值,但实际上并没有发生。这就是令人讨厌的令人沮丧的地方。

运行脚本后,我检查了 filezilla 中的会话文件。这两个值不存在。但是,如果我在脚本底部输出会话转储,则两个值会显示在该输出中。

如果我从浏览器中删除会话,然后重新加载页面,这两个值和其他一些值将显示在新的会话文件中,但是当然,从以前的文件(例如登录)中存储的其他值丢失了。

到目前为止,我已经解决了这个问题:-

  1. 所有其他文件(从登录到此“索引”)正在创建和/或存储和检索到/从会话中没有问题。
  2. “索引”脚本未添加到现有会话文件中。
  3. 通过从浏览器中删除会话 cookie 强制新会话显示数据正按预期存储在正确的服务器目录中。
  4. 使用冲洗();在我的脚本结束时(或会话创建/加载后的任何地方);没有任何区别。

你们中的任何人都可以告诉我发生了什么(不是)吗?

my $sessions_dir_location = '/' . $var . '/' . $www . '/' . $vhosts . '/' . $domain . '/name_of_sessions_storage_dir/';

my $session = new CGI::Session(undef, $cgi, {Directory=>"$sessions_dir_location"}) or die CGI::Session->errstr;


my $session_id = $session->id();
$session->flush();
my %vars = $cgi-Vars;
my $business_id = $vars{'business_id'};

print qq(<pre>bid=$business_id</pre>); #successful

$session->param('business_id', $business_id); #unsuccessful

print qq(<pre>session_id = $session_id); #successful

print $session->dump; # shows the business_id value as being stored. 
print qq(</pre>);

标签: perlsession

解决方案


以下对我有用business_id,每次调用都会将会话参数增加一个:

use strict;
use warnings;
use CGI;
use CGI::Session;

my $cgi = CGI->new();
my $sessions_dir_location = "/tmp/sessions";

# Data Source Name, defaults to "driver:file;serializer:default;id:md5"
my $dsn = undef;

# new() : returns new session object, or undef on failure. Error message is
#   accessible through errstr() - class method.
my $session = CGI::Session->new(
    $dsn, $cgi, {Directory=>"$sessions_dir_location"}) or die CGI::Session->errstr();
my %vars = $cgi->Vars;
my $cgi_bsid = $vars{business_id};
my $session_bsid = $session->param("business_id");
my $new_bsid = $cgi_bsid // $session_bsid // 0;
$new_bsid++;
$session->param('business_id', $new_bsid);
$session->flush() or die CGI::Session->errstr();

# CGI::Session will use this cookie to identify the user at his/her next request
#   and will be able to load his/her previously stored session data.
print $session->header();

my $session_id = $session->id();
print $cgi->start_html();
print join "<br>",
  qq(session_id=$session_id),
  qq(cgi_bsid=$cgi_bsid),
  qq(session_bsid=$session_bsid),
  qq(new_id=$new_bsid);
print $cgi->end_html();

推荐阅读