0

用户在我的 Web 应用程序中输入一个页面。如果 cookie 过期,我会向用户提供登录页面的链接,要求用户再次登录。如果他单击注销按钮,则 cookie 将在过去过期。

    $cookie = $cgi->cookie(-name=>"CGISESSID",-value=>'', -path=>'/',-expires=>'-1d');

如浏览器的页面信息中所示,cookie 已正确设置为过去过期但是页面不知道,直到我单击刷新

my $cookie = $cgi->cookie('CGISESSID');
if ($cookie){
        #show content
}else{
        $cookie = $cgi->cookie(-name=>'CGISESSID', -expires=>'now');
        print $cgi->header(-cookie=>$cookie);
        print "Please log in again ";
        print "<a href=\"/login.html\"> Login page </a>";
}

如何强制页面刷新以删除 cookie。如果我重定向页面,即使 cookie 过期,一个简单的后退按钮也会显示内容。

我在http://www.ibm.com/developerworks/webservices/library/ws-simpllogin/#loginJS中设置了 login.pl 和 login.js

4

2 回答 2

2

注销时,您可以重定向到另一个页面:

$cookie = $cgi->cookie(-name=>'CGISESSID', -expires=>'now');
print $cgi->redirect(-uri => 'http://www.example.com/login', -cookie => $cookie);

编辑:我想我误解了你的问题。听起来您真正想要做的是在 cookie 过期后立即重定向。这很棘手。假设我们用户的会话过期,但他们只是在浏览器中保持当前页面打开。不幸的是,在用户发送另一个请求之前,我们的 CGI 脚本不会再次运行,比如刷新页面。在他们发送请求之前,我们不会知道他们的会话是否已过期。

一种可能的解决方案是使用 HTML<meta>标记将页面设置为自动刷新:

use CGI qw(meta);

print $q->header,
      $q->start_html(
          -head => meta( { -http_equiv => 'refresh',
                           -content => '60;URL=http://www.example.com/foo.cgi' } )
      ),
...

这将每 60 秒重定向到您的 CGI 脚本,允许您再次检查会话。

另一方面,在 Perl 中开发 Web 应用程序确实有比 CGI.pm 更好的工具:DancerMojoliciousCatalyst等等。

于 2013-09-24T18:20:40.160 回答
1

尝试 :

   print $cgi->redirect($SS1);
   # $SS1 is the url for login.html
于 2013-09-24T18:25:52.943 回答