
No.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;
}
お礼が遅くなってしまいまして、申し訳ございません。
このように大変ご親切にお教えくださり、ありがとうございます。
まだ初心者であることもあり、
これを理解しきれないのですが、
これを参考にさせていただき、
さらに勉強させていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 「ログイン機能を持たせる」説明が気難しいです。 2 2022/10/11 02:59
- ガラケー・PHS 携帯電話の居場所信号の発信タイミング 3 2022/07/27 14:39
- PHP PHPのセッション有効期限について 5 2023/06/14 12:40
- 映画館 上映中に携帯電話を使うこと 2 2022/08/01 15:16
- Wi-Fi・無線LAN 携帯が会社のWiFiに繋がったまま、業務と関係ないサイトを閲覧してしまいました。 仕事の都合で休憩時 4 2022/10/21 14:54
- その他(セキュリティ) IDと暗証番号・パスワードの管理の画期的かつ簡単便利な方法を考案した。他人に検証してもらう方法は? 5 2023/02/08 08:49
- 会社経営 ビジネス用の電話番号。050で始まる電話番号について。 5 2022/06/10 09:42
- その他(プログラミング・Web制作) WEBアプリ開発に必要な言語 5 2023/06/28 16:57
- Yahoo!メール Yahooアカウントにログインできなくなって困っています。 2 2023/05/16 02:28
- 分譲マンション 分譲マンションに住んでおり、管理組合の役員をしております。 ベランダで喫煙する居住者がいます。管理規 2 2023/01/14 08:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
保存されたレコードの一部のみ...
-
perl cgiの変数の受け渡しがで...
-
CGIプログラムの最後に?がつい...
-
フォームに入力した情報をその...
-
データを読み込んだ時・・・・
-
アンケートフォーム複数ページ...
-
VBAでIEを操作submit処理について
-
SUN BBSの改造方法
-
wordの数式について 定積分を書...
-
掲示板(kentさんの所のsunbbs...
-
サイトの階層について
-
Perlでメール送信機能
-
データ削除方法について
-
ダブルクオテーションは使うべ...
-
perlで索引スタイルありますか。
-
二つのプルダウンメニューから...
-
ネットで買い物をしていてわか...
-
パスワード認証
-
Googleサイト内検索窓設置について
-
ひらがなチェック
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
(Perl)ReadParseによるハッシ...
-
確認ページが表示できない
-
別サーバーのcgiへバイナリデー...
-
質問ページ(CGI)に行く時にフ...
-
htmlのフォームからcgiにデータ...
-
フォーム入力後の確認画面表示...
-
携帯電話のセッション管理
-
さくらインターネットのCGI...
-
WEB上のボタンをクリックしてサ...
-
perl cgiの変数の受け渡しがで...
-
ファイル名でなく、ファイルの...
-
異なるformで同一のnameは使用...
-
cgi-libを使って変数値渡しをし...
-
htmlからcgiに変数を配列にして...
-
HDMLでCGIを使おうと思うのです...
-
perlで自動ログインをしたいが...
-
チャットでの、自動カーソル入力
-
if構文を追加するとうまくうま...
-
リンクからのPOST送信について
-
VBで表示したホームページの...
おすすめ情報