免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3435 | 回复: 4
打印 上一主题 下一主题

CGI::Session和redirect [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-01 19:08 |只看该作者 |倒序浏览
看刚才那个帖子,有点angry和郁闷,莫非是偶讲的不够清楚?
OK let's rego,重走一遍流程。

假设用户需要登录,登录页面的代码如下:
  1. # cat welcome.cgi
  2. #!/usr/bin/perl
  3. use strict;
  4. use CGI;
  5. use CGI::Session;
  6. require 'session.pl';

  7. my $q = CGI->new;
  8. my $session = fetch_session();
  9. print $session->header(-type=>'text/html');

  10. print <<HTML;
  11. <html>
  12.   <head>
  13.     <title>welcome</title>
  14.   </head>
  15.   <body>
  16.     <form action = "/cgi-bin/login.cgi" >
  17.        Please enter your username and password.
  18.        <br>
  19.        <br>
  20.        username:<input type="text" name="user"> <br>
  21.        password:<input type="password" name="pass">
  22.        <br>
  23.        <input type="submit"/>
  24.     </form>
  25.   </body>
  26. </html>
  27. HTML
复制代码
在用户打开welcome.cgi时,脚本就创建了一个session,并将sid发送到了客户端。
然后用户进行登录,login.cgi代码如下:
  1. # cat login.cgi
  2. #!/usr/bin/perl
  3. use strict;
  4. use CGI;
  5. use CGI::Session;
  6. require 'session.pl';

  7. my $q = CGI->new;
  8. my $session = fetch_session();

  9. if ($q->param('user') eq 'guest' and $q->param('pass') eq '12345') {
  10.     $session->param('login',1);
  11. } else {
  12.     $session->param('login',0);
  13. }

  14. print $q->redirect("afterlogin.cgi");
复制代码
login.cgi在接收到正确的用户名和密码后,会在session里保存登录状态为1,否则为0.
然后,执行一个redirect,跳转到afterlogin.cgi.
  1. # cat afterlogin.cgi
  2. #!/usr/bin/perl
  3. use strict;
  4. use CGI;
  5. use CGI::Session;
  6. require 'session.pl';

  7. my $q = CGI->new;
  8. my $session = fetch_session();
  9. print $session->header(-type=>"text/plain");

  10. my $logined = $session->param('login');
  11. print "logined: $logined";
复制代码
afterlogin.cgi简单的从session里读取登录状态,并print到浏览器。
整个过程session都是正确执行的。session依赖于一个sid,这个sid既发往客户端,又在服务器上保存。
当welcome.cgi创建了session并传递sid给浏览器后,浏览器在后续请求里,都会带上这个sid.
如下session.pl演示了这个session的创建/加载过程:
  1. # cat session.pl
  2. sub fetch_session {
  3.     my $session = CGI::Session->load() or die CGI::Session->errstr;
  4.     if ( $session->is_expired or $session->is_empty ) {
  5.         $session = new CGI::Session() or die CGI::Session->errstr;
  6.         $session->expire('+30m');
  7.     }
  8.     $session;
  9. }

  10. 1;
复制代码
在创建好上述几个脚本并设置权限后,就可以通过:
http://1.2.3.4/cgi-bin/welcome.cgi
来访问。在输入guest和12345后,可以看到页面输出logined: 1,否则是logined: 0.

I hope this helps.
否则不是你疯就是俺crazy了。

论坛徽章:
0
2 [报告]
发表于 2010-04-06 14:34 |只看该作者
我照着作的怎么也不行?

在命令窗口里面显示是好的:

  1. C:\Program Files\Apache Software Foundation\Apache2.2\cgi-bin>perl welcome.cgi
  2. Set-Cookie: CGISESSID=608ecefc35cbee406a1df284d91908e2; path=/; expires=Tue, 06-Apr-2010 06:54:54 GMT
  3. Date: Tue, 06 Apr 2010 06:24:54 GMT
  4. Content-Type: text/html; charset=ISO-8859-1

  5. <html>
  6.   <head>
  7.     <title>welcome</title>
  8.   </head>
  9.   <body>
  10.     <form action = "/cgi-bin/login.cgi" >
  11.        Please enter your username and password.
  12.        <br>
  13.        <br>
  14.        username:<input type="text" name="user"> <br>
  15.        password:<input type="password" name="pass">
  16.        <br>
  17.        <input type="submit"/>
  18.     </form>
  19.   </body>
  20. </html>
复制代码
可是浏览器里面就不行了, 用了use CGI::Carp qw(warningsToBrowser fatalsToBrowser);也没信息,只是说Internal Server Error,
access.log里面:
127.0.0.1 - - [06/Apr/2010:14:25:27 +0800] "GET /cgi-bin/welcome.cgi HTTP/1.1" 500 540
error.log里面:
[Tue Apr 06 14:25:27 2010] [error] [client 127.0.0.1] (OS 3)The system cannot find the path specified.  : couldn't spawn child process: C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/welcome.cgi

怎么回事?文件名没弄错。。

论坛徽章:
0
3 [报告]
发表于 2010-04-06 14:50 |只看该作者
第一句话都没改。。太挫了
C:/perl/bin/perl.exe

论坛徽章:
0
4 [报告]
发表于 2010-04-08 13:58 |只看该作者
都怪我发帖前没看论坛其它贴,唉,早知道就不发了。
我一般使用session保存登录后的用户组别,然后根据组别决定用户权限,很方便,
但是我一直害怕别人可以在这里做什么手脚,越过登录步骤直接在session里面写入组别来访问后面的数据,
这样后面的页面没有到DB里验证,直接给了session里的权限,我感觉有点不太安全。
目前是不是有这种技术可以自己建立一个session,直接访问afterlogin页面?

论坛徽章:
0
5 [报告]
发表于 2010-04-08 14:00 |只看该作者
还有一个问题,我的页面都是.pl后缀的,当然用.CGI也可以,为何大家都喜欢用.CGI做后缀呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP