重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

プログラミング初心者です。
現在、誰でも閲覧・利用できるようになっている携帯サイトを
会員制に移行させたいと思っております。
サイトやPerlで作成されている掲示板に
携帯電話のセッション管理の機能をつけられるようなプログラムなどありましたら教えてください。
もしなければその方法などをお教えいただけませんでしょうか?
phpならばセッション管理が簡単にできるようですが
perlで作成されている掲示板には使用できないので困っております。
どうかよろしくお願いいたします。

A 回答 (1件)

CGI::Session を使えばいいと思います。



以下のサイトあたりが参考になると思います。
http://www.dab.hi-ho.ne.jp/sasa/biboroku/perl/se …
http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83% …
http://www.ksknet.net/cgi/cgisession.html

私のゴミみたいなテストプログラムも載せておきます。
#!/usr/bin/perl -T
use warnings;
use strict;
use utf8;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use CGI::Pretty;

use CGI::Session;

# 異なるipからのアクセスは認めない場合
# use CGI::Session qw/-ip_match/;

# http://search.cpan.org/dist/CGI-Session/
# http://www.dab.hi-ho.ne.jp/sasa/biboroku/perl/se …
# http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83% …
# http://www.ksknet.net/cgi/cgisession.html

use constant SESSION_DIR => '/tmp/session';

if ( ! -d SESSION_DIR ) {
mkdir SESSION_DIR or die "$!";
}

# Clean Session File
CGI::Session->find( undef, \&purge, { Directory => SESSION_DIR } )
or die CGI::Session->errstr();

sub purge {
my ($session) = @_;
next if $session->is_empty; # already expired

# Delete 1 hour old
if ( ( $session->ctime + 3600 ) <= time() ) {
$session->delete();
$session->flush();
}
}

my $q = CGI->new();
my ($login) = $q->param('login');
if ( defined $login ) {

# Recv Form

if ( $login eq 'login' ) {
my ($user_name) = $q->param('user_name');

# Clean Old Session File
CGI::Session->find(
undef,
sub {
my ($session) = @_;
next if $session->is_empty; # already expired

# $user_name
my ($session_user_name) = $session->param;
if ( ( defined $session_user_name )
|| ( defined $user_name )
|| ( $session_user_name eq $user_name ) )
{
$session->delete();
$session->flush();
}
},
{ Directory => SESSION_DIR }
) or die CGI::Session->errstr();

my $s = new CGI::Session( undef, $q, { Directory => SESSION_DIR } );
$s->expire('+1m'); # 1 Minute
$s->param( -user_name => $user_name ); # set user_name
print $s->header( -charset => 'UTF-8' ),
$q->start_html(),
$q->p( "New session! Session ID = ", $s->id ),
create_login_form( $q, 'logout' ),
$q->end_html;
}
elsif ( $login eq 'logout' ) {
my $s = CGI::Session->load( undef, $q, { Directory => SESSION_DIR } )
or die CGI::Session->errstr();
$s->close;
$s->delete;
$s->flush;
print $s->header( -charset => 'UTF-8' ),
$q->start_html(),
$q->p("Your session closed!"),
create_login_form( $q, 'login' ),
$q->end_html;
}
else {
die "Unknown Form $login";
}
}
else {

# Not Recv Form

my $s = CGI::Session->load( undef, $q, { Directory => SESSION_DIR } )
or die CGI::Session->errstr();
if ( $s->is_expired ) {
print $q->header( -charset => 'UTF-8' ),
$q->start_html(),
$q->p( "Your session timed out!. Session ID = ", $s->id ),
create_login_form( $q, 'login' ),
$q->end_html;
}
elsif ( $s->is_empty ) {
print $q->header( -charset => 'UTF-8' ),
$q->start_html(),
$q->p("You don't have session!"),
create_login_form( $q, 'login' ),
$q->end_html;
}
else {
my $sid = $s->id;
my $s = new CGI::Session( undef, $sid, { Directory => SESSION_DIR } );

if ( $sid != $s->id ) {

# Create New Session ID -> Unknown Session
# Delete Temporary Session
$s->close;
$s->delete;
print $q->header( -charset => 'UTF-8' ),
$q->start_html(),
$q->p( "Your session id don't match!. Session ID = ", $sid ),
create_login_form( $q, 'login' ),
$q->end_html;
}
else {
print $q->header( -charset => 'UTF-8' ),
$q->start_html(),
$q->p( "Your session id match!. Session ID = ", $sid ),
create_login_form( $q, 'logout' ),
$q->end_html;
}
}
}

sub create_login_form() {
my $q = shift || die "Require CGI object";
my $login = shift || 'login';

if ( ( $login ne 'login' ) && ( $login ne 'logout' ) ) {
die "$login doesn't match login or logout";
return 0;
}

my $form = $q->start_form(
-method => 'post',
-action => $ENV{SCRIPT_NAME}
);

if ( $login eq 'login' ) {
$form .= $q->textfield( -name => 'user_name' );
}

$form .= $q->submit(
-name => 'login',
-value => $login
) . $q->end_form;

return $form;
}
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまいまして、申し訳ございません。
このように大変ご親切にお教えくださり、ありがとうございます。
まだ初心者であることもあり、
これを理解しきれないのですが、
これを参考にさせていただき、
さらに勉強させていただきます。

お礼日時:2009/09/16 16:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!