【问题标题】:cgi sessions between two Perl scripts两个 Perl 脚本之间的 cgi 会话
【发布时间】:2015-04-03 04:02:14
【问题描述】:

我在我的网站中使用了两个 Perl 脚本。我在旁边有一个搜索字段,它调用第一个脚本,结果写入输出文件。 通过下一次单击,用户调用第二个脚本,这个脚本读取输出文件并根据用户搜索构建一个配置文件。 目前我只写输出文件,但我需要使用会话 ID 个性化这个文件。

我正在尝试使用 CGI::Session,但我不明白如何使用这两个 Perl 脚本。我想我需要比较会话 id,并为每个会话编写一个输出文件。

你们中有人知道怎么做吗?

第一个脚本: 我在文件中编写会话:

my $session = new CGI::Session(undef, $cgi, {Directory=>"/usr/local/path/"});

然后向客户端发送一个cookie:

my $cookie = $cgi->cookie(CGISESSID => $session->id );

第二个脚本: 尝试获取会话 ID:

$sid = $cgi->cookie("CGISESSID") || undef;
print $sid 

它给出了一个Status: 500。

【问题讨论】:

  • 您似乎已经很好地描述了您需要做的事情。你有什么问题?
  • 您是否尝试过阅读文档?您是否尝试过运行文档概要中的任何代码?
  • 我在帖子中添加了一些代码,抱歉缺少信息!
  • Status: 500 是内部服务器错误。查看服务器的错误日志以了解它是什么。

标签: perl session cookies


【解决方案1】:

您需要将会话 ID 传递给客户端,以便客户端在以后的请求中将其返回给您。这通常使用 cookie 完成。

use utf8;
use open ':std', ':encoding(UTF-8)';

use CGI          qw( -utf8 );
use CGI::Session qw( );

use constant SESSION_DIR    => '...';
use constant SESSION_EXPIRE => '+12h';  # From last use (not creation)

my $cgi = CGI->new();

my $session = CGI::Session->new(
   'driver:file',
   scalar($cgi->cookie('session_id')),
   { Directory => SESSION_DIR },
);
$session->expire(SESSION_EXPIRE);

# Whatever your page does
my $count = $session->param('count');
++$count;
$session->param(count => $count);
my $content = "This is request $count";

print
   $cgi->header(
      -type    => 'text/html',
      -charset => 'UTF-8',
      -cookie => $cgi->cookie(
         -name => 'session_id',
         -value => $session->id,
         -expires => SESSION_EXPIRE,
       ),
   ),
   $content;

这里只显示了一个脚本,但显然没有什么可以阻止两个脚本访问同一个会话(如果它们可以访问同一个会话存储)。

【讨论】:

  • 嘿感谢您的回复! Cookies anf 文件是从第一个脚本正确写入的。但是当我尝试从另一个脚本中获取 cookie 时:'$sid = $cgi->cookie("CGISESSID") ||未定义; $session = new CGI::Session(undef, $sid, {Directory=>'/tmp'});'我收到错误消息:无法在 /Scriptname 的未定义值上调用方法“cookie”..
猜你喜欢
  • 2013-05-13
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
相关资源
最近更新 更多