• 締切済み

セッションがうまくできません

#!c:/Perl/bin/Perl.exe ------セッションを作成する------- use CGI::Session; $session = new CGI::Session(undef,undef,{Directory=>'/tmp'}); $session->expire('+50s'); $session->param("membername","テスト"); $session->flush(); print "Location: ./test.pl\n\n"; ------セッションを読み込む------- #!c:/Perl/bin/Perl.exe print"Content-type: text/html\n\n"; use CGI; use CGI::Session; $q = new CGI(); $session = CGI::Session->new(undef,$q,{Directory=>'/tmp'}); $params = $session->param_hashref(); print$params->{"message"}; $session->flush(); 何もブラウザに表示がされません、どこが間違ってるのでしょうか?

  • Perl
  • 回答数2
  • ありがとう数0

みんなの回答

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.2

もしかして、 上では >$session->param("membername","テスト"); こうしてるのに、 下では >print$params->{"message"}; こうしてるから ってそれだけの問題じゃないですよね? 後から気付いた#1でした。

JIF0131
質問者

補足

>上では >>$session->param("membername","テスト"); >こうしてるのに、 >下では >>print$params->{"message"}; >こうしてるから こちらは教えてgooに投票するときに間違えただけです(汗) でも自己解決しました。理由はヘッダ情報の出力を追加したら大丈夫でした print $session->header(-charset => "shift-jis"); これで正常に動きました。ご迷惑おかけしました。

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.1

こんにちは、 下の方のスクリプトで CGI::Session オブジェクトを生成する際に、 CGI オブジェクトを渡していますが、その CGI オブジェクトは param か cookie にセッションIDを持っているんでしょうか? もし、上のスクリプトが下のスクリプトへリダイレクトしているのなら、 セッションIDをどうやって渡しているのでしょうか? ”HTTPはステートレスなプロトコル”だと言う事をお忘れでは?

関連するQ&A

  • "use CGI::Session"でエラーが発生してしまいます

    初投稿です。宜しくお願いします。 ActivePerl5.8.0+Apache1.3.14でSessionを使用した Webサイトを作成中なのですが、 ppm経由でインストールしたCGI::Sessionを useしようとしても、エラーになってしまいます。 サンプルコードは以下の通りです。 #!/usr/bin/perl use CGI::Session; &ses(); &print(); sub ses() { # Session作成・ここから my $session = new CGI::Session(undef, undef, {Directory => './tmp'}); my $tmpSID = $session->id(); $session->param('menu', 'MENU1'); $session->expire('+2h'); $session->header(); } sub print() { print "Content-type: text/html;charset=ISO-2022-JP\n\n"; print <<EOF; OK! EOF } use CGI::Session; の部分(と、Session関数を 呼び出している部分)をコメントアウト すると、とりあえずはエラーが出なくなるので、 原因はここだとわかっているのですが、 文法的に間違っているとは思えないですし、 困っています。 情報お願いいたします。

    • ベストアンサー
    • Perl
  • CGI::Session

    http://perldoc.jp/docs/modules/CGI-Session-3.11/Session.pod 上記サイトを参考に、 use CGI::Session; my $session = new CGI::Session("driver:File", undef, {Directory=>'/tmp'}); my $CGISESSID = $session->id(); を稼動中の掲示板CGIに組み込んでみたところ、$session がnullになるようで、$session->id()のところでエラーになってしまいます。 (use CGI::Session;の行ではエラーにはなりません。) ■driver:Fileをdriver::Fileにしてみました。 ■driver:Fileをundefにしてみました。 ■my $query = new CGI;を追加し、 newの2番目の引数を$queryにしてみました。 ■tmpディレクトリの属性を744、766、777にしてみました。 ■/tmp を ./tmpにしてみました。 上記、いずれも同じ結果になってしまいました。 何がいけないのかわかりません。ファイルの構成は下記のようになっています。 /test.cgi /tmp /CGI/Session.pm /CGI/Session/ErrorHandler.pm アドバイスなどありましたら、よろしくお願いします。

  • perlにおけるセッションIDについて

    sessionIDがページを更新するたびに変わってしまいます。 その結果、前回セッションに保存した値を読み込めません。 my $cgi = new CGI; CGI::Session->name("SESSION_ID"); my $session = new CGI::Session("driver:File", $cgi, {Directory=>'./session'}); print $session->header(-charset=>'UTF-8'); print $session->id(); print $session->param("name"); #表示されず。 というようにしてセッションIDを表示すると、毎回変化します。 どうしたらIDを変わらないように出来るでしょうか? ちなみに、セッションに書き込むのは、 my $cgi = new CGI; CGI::Session->name("SESSION_ID"); my $session = new CGI::Session("driver:File", $cgi, {Directory=>'./session'}); $session->header(-charset=>'UTF-8'); $session->param("name", "abc"); $session->flush(); undef($session); こんな処理をしてます。

    • ベストアンサー
    • Perl
  • セッションファイルが作成できない!!

    Perl5.8を使用してセッション管理の学習をしています。 CGI::Session3.95ライブラリをインストールしました。 OSはWindowsXPです。 session objectは以下のように作成しました。 my $session= new CGI::Session("driver:File",undef,{Directory=>"/tmp"}); パラメータも書き足しました。 my $name=$cgi->param("name"); my $address=$cgi->param("address"); $session->param("name",$name); $session->param("address",$address); コマンドプロンプトで実行すると (in cleanup) could not flush: Couldn't store 10072b9e2a3580831dd151127e0 d1989 into \tmp\cgisess_10072b9e2a3580831dd151127e0d1989: No such file or directory とエラーメッセージが出力されて、ファイルが作成できません。 session object作成の第三引数の当たりに 何か不具合でもあるのか? 事前準備(環境設定など)に不備があるのか? 心当たりのある方、教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • hiddenを使ったセッション

    こんにちは。 セッションを使ったデータの受け渡しをしたいのですが、 (携帯を考慮してcookieは使わないやり方で) hiddenにセッションIDを持たせる方法で書いてみたのですが、 うまくいきません。 送られてはいるけど、受け取れていないのかな…? とは思うのですが、対処がわかりません。 以下のソースです。(確認用でGETにしてます) 望むのは、printされたセッションIDとテキスト内のセッションIDが 同一になる(=セッションが保持できてるということですよね?) かつ、submitしても、セッションIDが変わらない、という状況です。 よろしくお願いいたします。 print "Content-type: text/html\n\n"; use CGI; use CGI::Session qw/-ip-match/; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'}); } else { $query_string = $ENV{'QUERY_STRING'}; } my $cgi = new CGI; CGI::Session->name("session_id"); my $session = new CGI::Session("driver:File", $cgi, {Directory=>'./session'}); $sid = $session->id(); $session->param('value', $sid); $sesid = $session->param('value'); print $sesid."<br>\n"; undef($session); @query = split(/&/, $query_string); foreach $query (@query){ ($name, $data) = split(/=/, $query); $data{$name} = $data; } print <<"EO"; <html><head> <title> </title> </head> <body><hr><hr> <form action="./test.cgi" method="GET"> <input type="hidden" name="session_id" value="$sesid"> <input type="text" name="btn" size="50" value="$data{'session_id'}"><br> <input type="submit" value="submit"><br> </form> <hr><hr></body></html> EO

  • 続Gecko エンジンでの Location ヘッダについて

    Gecko エンジンでの Location ヘッダについて http://oshiete1.goo.ne.jp/qa4227374.html の続きです。 なんだかよく分からない状況になったのでより実際の処理とほぼ同様の 処理を行っているサンプルを用意しました。 # セッション管理 use strict; use CGI::Session; &main(); # メイン sub main { my $cgi = &getreq(); print "Pragma: no-cache\n"; print "Cache-Control: no-cache\n"; # セッション取得 my $session = &session($cgi); # セッションが取得できない場合、再取得 if($session == undef) { # print "Content-type: text/plain\n\n"; # print "CGISESSID=$cgi->{'CGISESSID'}\n"; $session = &session({}); # セッション ID を取得してリダイレクト my $id = $session->id(); print "Location: ./?CGISESSID=$id\n\n"; exit; } my $id = $session->id(); if($cgi->{'CGISESSID'} eq '' || $cgi->{'CGISESSID'} ne $id) { # print "Content-type: text/plain\n\n"; # print "CGISESSID=$cgi->{'CGISESSID'}\n"; # セッション ID が指定されていないまたは # セッション ID が異なる場合リダイレクト print "Location: ./?CGISESSID=$id\n\n"; exit; } print "Content-type: text/plain\n\n"; print "CGISESSID=$id\n"; print "OK\n"; exit; } # CGI リクエストの取得 sub getreq { my $cgi = {}; my $query = ''; $query = $ENV{'QUERY_STRING'}; my @args = split(/&/, $query); foreach my $i (@args) { my ($name, $val) = split(/=/, $i); $val =~ tr/+/ /; $val =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $name =~ tr/+/ /; $name =~ s/%([0-9a-f]{2})/pack('C', hex($1))/eig; $cgi->{$name} = $val; } delete($cgi->{''}); return $cgi; } # セッション取得 sub session { my $cgi = shift; my $dir = { 'Directory' => 'tmp' }; CGI::Session->find(undef, sub {}, $dir); if($cgi->{'CGISESSID'} eq '') { my $session = new CGI::Session(undef, undef, $dir); $session->expire("1h"); return $session; } my $session = CGI::Session->load(undef, $cgi->{'CGISESSID'}, $dir); return ($session == undef || $session->id() eq '') ? undef : $session; } こんな感じのCGIで以下のような状況の時にページを更新すると IE(Trident)/Opera(Presto)及びSafari for Win(WebKit)では 正常に動作するのですがFxやSeaMonkey(Gecko)ではおかしな動作を します。 1. セッションが切れた時 2. セッションファイルを手動で削除した時 具体的にはセッションが切れたら再度新しいセッションを作成して リダイレクトをするようにしてあるのですがGeckoでは一度セッションが 切れると更新する度に新しいセッションを作成するようになってしまい ます。 以前の質問の回答のように Status: 303 See Other ヘッダを出力して 見たのですがやはり効果はないようです。 Cookieは使いたくないのでセッションID(sesid)をCGIリクエストで 送信しているのですがこの方法がまず問題なのでしょうか。 他にも問題のある部分がありましたらご指摘お願いします。

    • ベストアンサー
    • CGI
  • Tomcat で CGI の実行結果が表示されません

    Tomcat 6.0.24 を使って、perl または python で記述された cgi を実行したいのですが 実行されているのかされていないのか?がよくわからない状態で困っています。 ※環境は Windows XP Pro SP3 上です。 具体的には、cgi 側で単純な HTML を print し、その結果をブラウザで確認したいだけなのですが その print 結果が何も出力されません。 (ブラウザでアクセスすると、特にエラーは出ず、真っ白な画面) ◆試している cgi ソース(Perl) -------------------------------------------- test.cgi -------------------------------------------- #! c:/perl/bin/perl print "Content-Type: text/html\n\n" print "<html><body>Hello, World</body></html>" -------------------------------------------- ◆この test.cgi を配置している場所  インストールディレクトリ/webapps/ROOT/WEB-INF/cgi/test.cgi ◆ブラウザでアクセスしている場所  http://localhost:8080/cgi-bin/test.cgi ◆検証用 HTML の配置  インストールディレクトリ/webapps/ROOT/WEB-INF/cgi/test.html  →普通の HTML を確認のために配置。しかし、同様のアクセスで表示できず(画面真っ白) ちなみに、Tomcat インストール後にやったことは以下です。  1.インストールディレクトリ/conf/context.xml の 以下の部分に    「privileged="true"」という記述を追加    <Context>     /*中略*/    </Context>    ↓    <Context privileged="true">     /*中略*/    </Context>     2.インストールディレクトリ/conf/web.xml の以下の部分のコメント化を解除    <servlet>     <servlet-name>cgi</servlet-name>    /*中略*/    </servlet>    <servlet-mapping>     <servlet-name>cgi</servlet-name>     <url-pattern>/cgi-bin/*</url-pattern>    </servlet-mapping>  3.上の1、2では perl を実行してくれないので、    インストールディレクトリ/conf/web.xml に以下を追加    <init-param>     <param-name>executable</param-name>     <param-value>C:\Perl\bin\perl.exe</param-value>    </init-param>     ↓結果的に    <servlet>     <servlet-name>cgi</servlet-name>    /*中略*/     <init-param>      <param-name>executable</param-name>      <param-value>C:\Perl\bin\perl.exe</param-value>     </init-param>    </servlet> 以上ですが、何かヒントになるようなことでもよいので、識者の方、アドバイスをお願いいたします。

    • 締切済み
    • CGI
  • CGI::Sessionの使い方

    CGI::Sessionなどを使ったことがない初心者です。 どの端末から掲示板に投稿されたか識別するだけのために (セッションの画面遷移は不要) PerlのCGI::Sessionを使ってセッションIDを発行し、 CGI内のセッション記録用ファイルにいつどの端末から投稿されたか記録したいと思っています。 そこでCGI::Sessionについて調べてみたのですが my $session = new CGI::Session("driver:MySQL", $cgi, {Directory=>'./session'}); データーベースはMySQLでなければいけないのでしょうか? My SQLではなく例えばディレクトリ内のdate/session-date.textなどに記録し、 扱いことはできないのでしょうか? またそのような場合にはどのように記述するのか教えてください!

    • ベストアンサー
    • Perl
  • セッションタイムアウトエラー

    いつも参考にしております。 セッションタイムアウトのエラー(???)で困ってます。 ご存知の方がいらっしゃいましたら、ご教授お願いします。 環境: OS :Windows 2009 Sever ActivePerl : V5.8.9 Webサーバ :IISv7.0 CGI::Session.pm:v4.41 DB :Oracle 10g 詳細は下記のようです。 1.ログイン成功したら、セッションを作成します。 CGI::Session->name( "SID" ); my $session = new CGI::Session( "driver:File", undef, {Directory => 'C:/Inetpub/wwwroot/xxx/tmp/session'} ); $session->expire( '+10h' ); ...省略 2.上記で作成されたセッションIDを画面に保持し、画面遷移する際に セッションIDの存在チェックを行う my $session = CGI::Session -> new( undef, $sid, {Directory => 'C:/Inetpub/wwwroot/xxx/tmp/session'} ); if($sid eq $session -> id) { // セッションID存在する // 次の画面遷移する // セッションタイムアウト再設定 $session->expire( '+10h' ); } else { // セッションID存在しない $session->close; $session->delete; // 作成されたセッションファイルを削除 // エラー画面表示 } 現象: セッションタイムアウトの設定時間に経ってないにもかかわらず たまたまセッションタイムエラーが発生します。 P.S エラーの原因が特定できず、困ってます。 以上、宜しくお願いいたします

    • 締切済み
    • CGI
  • 次のcgiファイルを開くには? もう一度

    http://oshiete1.goo.ne.jp/qa3951263.html で質問している者です。 間違って、[回答への補足] に書いてしまいました。 もう一度質問させてください。すみません。 Location を 教えていただき、とても感謝しております。 でも、私の 001.cgi は 以下のように始まっております。 print header(-charset => 'Shift_JIS'); print start_html("001.cgi"); このprint header(-charset => 'Shift_JIS');を消して if (param('answer') eq $ans){ print ('Location:002.cgi\n\n'); } else{ print header(-charset => 'Shift_JIS'); ##省略## print endform; { としたのですが、だめでした。 if (param('answer') eq $ans) が 下の方にもう一度出てくるからでしょうか? ###### はじめ ##################### #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); print "Location:1266.cgi\n\n"; ###### おわり ##################### としたら、001.cgi を開くと 002.cgi へ飛ぶことができました。 どこに print "Location:1266.cgi\n\n"; を書けばよいのでしょうか? よろしく、お願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう