よろしくお願いいたします。

CGIはステートレスでセッションが区別できない。
しかし、JAVAサブレットはステートフルで
CPUの負担を軽減させ、安定している
と言う表現がテキストにあったのですが、
いったい何を言っているのか分かりやすく
説明していただけないでしょうか?
是非よろしくお願いいたします。

ケーブルでのステートレスとかならイメージが湧くのですが・・・

このQ&Aに関連する最新のQ&A

A 回答 (2件)

> 状態をもてるとユーザー側からみて


> メリットはあるのでしょうか?

複数ページにわたって処理をするような CGI では、「状態」を保持する必要があります。

例えば、会員制のネット販売(ログインをした会員情報を保持する)とか、項目が
多いアンケートページ(前のページまでの回答を保持)とか。

CGI でも、頑張れば状態を保持できるのですが、頑張らないといけません。

というわけで、開発言語の違いを除けば、大きくメリットを教授できるのは開発者の
方になります。
    • good
    • 0
この回答へのお礼

遅くなりまして申し訳ありません。
回答ありがとうございました。
なるほどものすごく分かりやすい説明で大変助かりました。
開発者にとってメリットが大きいんですね。
ありがとうございました。

お礼日時:2001/11/10 11:57

ここでいう「ステートレス」、「ステートフル」というのは、状態を持てないか・持てるか


の違いを言います。

主に「状態」は、前回(前々回でも良いんですが)に実行された CGI がどういう
状態だったか、を指します。普通は、その実行時に指定されたパラメータや、実行結果を
状態として受け渡せるかどうか、です。

普通の CGI は、起動されるたびに別のプロセスとして起動され、前回に何をやって
いたかどうかは、CGI の仕組みだけでは伝えることができず、Cookie やサーバの
ファイルを経由して受け渡さないと分かりません。

サーブレットは、サーブレットコンテナの配下で動く Java のスレッドで(なんて、
仕組みを知っている必要はわからなくてもいいんですが)状態を受け渡すための
仕組み(セッションオブジェクト)を持っています。

また、ステートフルであるかどうかと「CPUの負担を軽減させ、安定している」とは
直接つながりはありません。処理を実行するたびにプロセスを作るかどうかが
CPU負荷の軽減につながります。
    • good
    • 0
この回答へのお礼

お忙しい中、回答ありがとうございます。
なるほと状態を区別するかしないかの
違いがあるんですね。
状態をもてるとユーザー側からみて
メリットはあるのでしょうか?
もし良かったらまたレスいただけるとうれしいです。

お礼日時:2001/11/07 23:58

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

このQ&Aと関連する良く見られている質問

Qperl/cgi セッションについて

www.ksknet.net/movabletype/archives/2004/09/cgisession.html

セッションについて上記を参考にしています。

セッションIDを付与しているのはソースから分かります。
ただ、付与したセッションをチェックするのが分かりません。(認証成功後のページからの全ての遷移先ページでセッションが有効かどうかチェックしますよね?)

index.html
↓ログイン成功。セッションを付与
aaa.cgi
↓セッションをチェック
bbb.cgi

ダイレクトに(セッションを付与されていない状態)
bbb.cgi
をアクセスしたときにアクセスできないようにならなければ意味がありませんので・・・。

$session->id()に値が入っているかどうかのチェック文を認証をかけたい全てのページに仕込めばよいのでしょうか?

文章おかしくてすみません・・

よろしくお願いいたします。

Aベストアンサー

単純にperlからcookieにアクセスする方法でよろしいでしょうか。

概説と具体例なら↓など解りやすいと思います。
http://www.tohoho-web.com/wwwcook.htm

しかし、私としては CGI::Lite というモジュールをおすすめします。
書式だの余計なことを考えずに、ハッシュから読んだり書いたりできます。
詳しくは↓など。
http://perldoc.jp/docs/modules/CGI-Lite-2.001-emergencyrelease/Lite.pod

Q携帯電話のセッション管理

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

Aベストアンサー

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

以下のサイトあたりが参考になると思います。
http://www.dab.hi-ho.ne.jp/sasa/biboroku/perl/session.html
http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2FCGI%3A%3ASession%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB
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/session.html
# http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2FCGI%3A%3ASession%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB
# 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;
}

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

以下のサイトあたりが参考になると思います。
http://www.dab.hi-ho.ne.jp/sasa/biboroku/perl/session.html
http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2FCGI%3A%3ASession%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB
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 C...続きを読む

Q全角、半角の区別をする。

年齢を入力した際に、現在の設定であればアルファベットやひらがなを入力したとしてもそのままcsvにおちてしまいますが、半角数字に限定し完了できるようにするにはどうすればよろしいのでしょうか?また、半角英数にした際も教えていただければ幸いです。

#! /usr/bin/perl

require "./mimew.pl";
require "./cgi-lib.pl";
&ReadParse();

# form.htmlより受取ったデータを変数に代入
$d[0]=$in{'name'};
$d[1]=$in{'sex'};
$d[2]=$in{'age'};

# 未入力チェック 
if($d[0] eq ""){$error[0]="お名前を入力して下さい";}
if($d[1] eq ""){$error[1]="性別を入力して下さい";}
if($d[2] eq ""){$error[2]="年齢を入力して下さい";}
#エラーメッセージを全部つないで
$error=$error[0].$error[1].$error[2];

# エラーが無いときの処理
if($error eq ""){

# データをカンマ区切りにしてdata.csvに保存
$data=join(",",$d[0],$d[1],$d[2])."\n";
open(FH,">>./data.csv");
print FH $data;
close FH;

年齢を入力した際に、現在の設定であればアルファベットやひらがなを入力したとしてもそのままcsvにおちてしまいますが、半角数字に限定し完了できるようにするにはどうすればよろしいのでしょうか?また、半角英数にした際も教えていただければ幸いです。

#! /usr/bin/perl

require "./mimew.pl";
require "./cgi-lib.pl";
&ReadParse();

# form.htmlより受取ったデータを変数に代入
$d[0]=$in{'name'};
$d[1]=$in{'sex'};
$d[2]=$in{'age'};

# 未入力チェック 
if($d[0] eq ""){$error[0]="...続きを読む

Aベストアンサー

>わたしがあまりCGIを詳しくなくというかほとんど素人で設置くらいしかできなくこの記述もほとんどつくっていただいたようなもので…。
その作ってもらった人に今回も頼むのがいいでしょうね。
素人がいじるには難しい

>ですので、不明な点がアウト時の処理となっている箇所は具体的にどのように記述すればよろしいのでしょうか?
未記入時にしている処理のような事をする。

>また、if~の記述はどの場所へ記述する必要がありますか?ご回答よろしくお願いいたします。
好きなところに
まぁチェックルーチンはまとめた方が後々も楽だろうし
未記入チェックの処理の後でしょうね。


あと今回の場合、半角チェックを入れずに
全角を半角に自動で変換するプログラムに
するのも手ですね。
Jcode.pmまたはjcode.plを用いて

後は年齢の部分を選択リストで選択する形にするとか
十の桁と一の桁を別々にして

Qこれはいったいどういうこと?

最近HPを作成しています。
掲示板なんかは設置しました。
あと「チャット」をどうしても設置したいのです。
がプロバイダーのHPに

「○○○インターネット接続サービス(個人向け)の個人ホームページで、
ご利用になれるCGIは、当社で準備したプログラムに限らせてい ただきます」

とありました。

これは「レンタルチャットルーム」などを設置してはいけないということなので
しょうか?CGIというものがなんなのかまったくわからないのでこの文章の意味が
わかりません!教えてください!

Aベストアンサー

レンタルならOKですよ。
レンタルはaquaquaのサーバーとは無関係ですから。

Q大文字と小文字を区別しない検索にする方法

勉強する間もなく手探りでフリーCGIの改造をさせて頂いています。
if ゃ foreach などは分かりやすいですが、変数の意味が良く理解できていません。
どうぞお力添えをお願い致します。

現在、フリーのCGIでデータ登録と検索をしていますが、大文字と小文字の
区別を無くしたものにするにはどうすればよいでしょうか?
1) AbcDe も abcde も同じにしたい。
2) 可能なら全角と半角も区別無しにしたい。
  ただ、2の方は漢字も使うので難しいでしようか?

iオプションを使えとの記述を見ましたが、どこを変えるのか解りません。
ソースを載せますので、ご指導宜しくお願い致します。



# 入力内容を整理
$in{'word'} =~ s/\x81\x40/ /g;
@wd = split(/\s+/, $in{'word'});


@find=(); $i=0;
# 検索処理
foreach (@line) {
$flag = 0;
foreach $wd (@wd) {
if (index($_,$wd) >= 0) {
$flag = 1;
if ($in{'cond'} eq 'OR') { last; }
} else { $andor="and 検索";
if ($in{'cond'} eq 'AND') { $flag=0; last; }
$andor="or 検索";
}
}
# ヒットした場合
$view = $in{'viewc'};
if ( $view eq '' ) { $view = $views }
if ($flag) {
$i++;

next if ($i < $page + 1);
next if ($i > $page + $view);

push(@find,$_);
}
}

# 検索終了

勉強する間もなく手探りでフリーCGIの改造をさせて頂いています。
if ゃ foreach などは分かりやすいですが、変数の意味が良く理解できていません。
どうぞお力添えをお願い致します。

現在、フリーのCGIでデータ登録と検索をしていますが、大文字と小文字の
区別を無くしたものにするにはどうすればよいでしょうか?
1) AbcDe も abcde も同じにしたい。
2) 可能なら全角と半角も区別無しにしたい。
  ただ、2の方は漢字も使うので難しいでしようか?

iオプションを使えとの記述を見ましたが、ど...続きを読む

Aベストアンサー

ShiftJIS コードの場合、漢字コードの2バイト目に正規表現の区切り文字やメタ文字と同じ
コードがあるためうまくいかないことがあります。英単語のみ正規表現を使って、それ以外は
index を使えばうまくいくかもしれません。

> if (index($_, $wd) >= 0) {

上の行を次のように変更してみてください。なお、英単語に can't や Dr. などがある場合は、
/^\w+$/ を /^[\w.']+$/ などに変更する必要があります。

if ($wd =~ /^\w+$/ ? $_ =~ /$wd/i : index($_, $wd) >= 0) {


このカテゴリの人気Q&Aランキング

おすすめ情報