cookieの読み込みができない問題の解決方法

このQ&Aのポイント
  • cookieを書込んだ直後に読み込めない問題について解説します。
  • cookieを書込んだ後、同じcgi内で即座に読み込むと読み込めません。
  • 解決策として、書込後にタイムラグを作ることが有効です。
回答を見る
  • ベストアンサー

書き込んだばかりのcookieが読み込めません

cookieを書込んだ直後、書込めたか(cookieをオフにしていたり、cookieを書込めない携帯端末からのアクセスかもしれないので)確認をしようと、cookieを読込もうとしたのですが、cookieが書込まれているにもかかわらず情報を取得することができません 実験環境として、htmlファイルにボタンを作って、cgiへ飛び、そのcgi内でcookieを書込み、cookieが書込めたかどうかで分岐して、表示するようにしています (cgiを一度実行したあと一旦ブラウザで前のhtmlファイルに戻って)cookieが既に書込まれた状態で、改めてhtmlファイルのボタンを押せばcookieは読込めますが、最初にcookieを書込んだ時に同じcgi内で即読込みを行ったら読込めません 書込が完結する前に読込みに行っているから読込めないのかとも思い、読込み前にタイムラグを作っても見ましたがやはり読込めません どうすれば書込み直後に読み込めるのでしょうか? 色々ネットで調べても見ましたが、いっこうに解決策が見つかりません ご存じの方ぜひご教授下さい よろしくお願いします なお、下にperlのコードを書いておきます #クッキーを書込 $test{sid} = "12345"; &set_cookie($test{sid}); #タイムラグ use Time::HiRes; Time::HiRes::sleep(0.8); #クッキーを読込 ($cookie{test}) = &get_cookie; if(!$cookie{test}){ print "読み込めてない"; } else{ print "読み込めた"; } ######→読み込めません##### #クッキー書込sub sub set_cookie { local(@cook) = @_; local($gmt, $cook, @t, @m, @w); @t = gmtime(time + 2*60*60); @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]); foreach (@cook) { s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $cook .= "$_<>"; } print "Set-Cookie: SID=$cook; expires=$gmt; path=/;\n"; } #クッキー読込sub sub get_cookie { local($key, $val, *cook); $cook = $ENV{'HTTP_COOKIE'}; foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } foreach ( split(/<>/, $cook{'SID'}) ) { s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; push(@cook,$_); } return (@cook); }

  • choei
  • お礼率63% (286/451)
  • Perl
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

cookieをprintしたあとにスリープして待ってるでしょ。 ブラウザはHTTPリクエストを投げるとき、以下のような文字列を投げる。ようするに、「開いた」ときにcookieを投げる POST /xxxx.cgi HTTP/1.1 Cookie: hoge="fuga"; ... ダイナミックにセット/ゲットしたけりゃ、javascriptでcookie読み書きして、AjaxでCGIと通信するしかない。

choei
質問者

お礼

ありがとうございます > 「開いた」ときにcookieを投げる ですか。 > AjaxでCGIと通信するしかない ブラウザで完結する方法はないみたいですね。 このcgiではなく他のアプローチを探してみます

その他の回答 (2)

回答No.2

ていうか、cookieはページを「開いた」ときにブラウザが投げるものだし。CGIでprintしたあと、いくらスリープしても、そりゃとれない

choei
質問者

お礼

>CGIでprintしたあと、いくらスリープしても スリープはprint前ですが。 >cookieはページを「開いた」ときにブラウザが投げるもの ということは、cgiでcookieを書込み、その後にブラウザをリロードやページ移動なしに一連のプログラムの中でcookieを取ろうとしてもできないということなのでしょうか? もしそうであれば、cookieが書き込めたか同一のプログラム内でチェックする方法はないのでしょうか?

回答No.1

よくわからず。 > 最初にcookieを書込んだ時に同じcgi内で即読込みを行ったら読込めません 上の一文だけ読むと、そもそも、CGIからブラウザにレスポンスを返していないので、ブラウザがcookieを保存していない。cookieが読めないのは当たり前?

choei
質問者

お礼

ありがとうございます。 >ブラウザがcookieを保存していない cookieの保存状態を随時確認しながら試してますが、cookieは保存されています

関連するQ&A

  • 指定ディレクトリからcookie取得

    $cook = $ENV{'HTTP_COOKIE'}; foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } $cook{'name'} ./index.cgiで、上記のように$ENV{'HTTP_COOKIE'}でクッキーを取得しています。 このままでは./に保存されたクッキーが取得されてしまいますが、これを、任意のディレクトリ(./../html/等)に保存された場所から取得したいと考えていますが、可能でしょうか。 CGIが設置されているディレクトリ = 'http://hogehoge/cgi-bin/'; COOKIEを読み込むディレクトリ = 'http://hogehoge/html/';

    • ベストアンサー
    • Perl
  • Cookieの有効期限について

    Cookieの有効期限を半年間にしようと思い、 プログラムを覗いてみたところ、以下のような記述がありました。 どこをいじれば半年間に伸ばすことができるのか教えていただけますか? どうかよろしくお願いいたします。 sub set_cookie { ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60); $yearg += 1900; if ($secg < 10) { $secg = "0$secg"; } if ($ming < 10) { $ming = "0$ming"; } if ($hourg < 10) { $hourg = "0$hourg"; } if ($mdayg < 10) { $mdayg = "0$mdayg"; } $month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong]; $youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wdayg]; $date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT"; $cook="name\:$FORM{'cntr'}\,email\:$FORM{'email'},pswd\:$FORM{'pswd'}"; print "Set-Cookie: TORBBS=$cook; expires=$date_gmt\n"; }

    • ベストアンサー
    • Perl
  • cookieについて教えてください。

    iswebのサーバーを借りています。 cookieの書きこみを下のような記述を試しています。 ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time + 60*60*3); @mons = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @week = ('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sut'); $date = sprintf("%s, %02d\-%s\-%04d %02d:%02d:%02d GMT",$week[$wday], $mday, $mons[$mon], $year+1900, $hour, $min, $sec); $mydata = "abc"; print "Set-Cookie: AAA=$mydata; expires=$date;"; print "Content-type: text/html\n"; print "\n"; print "<meta http-equiv="Set-Cookie" content="AAA=$mydata; expires=$date">"; 以下いろいろつづく。 この時にSet-Cookie: AAA=$mydata; expires=$date;";を残すとエラーが出てmetaを残すと動きます。 自分のパソコンの中では、両方動きます。 そこで教えていただきたいのですが、 javascriptのdocument.cookie、perlのSet-Cookie、metaのSet-Cookieの違いを教えてください。

    • ベストアンサー
    • Perl
  • 下のCookieの質問に関しまして補足です その2

    さらに調べていたのですが、どうやら登録されているURLのデータに「=」が含まれていると 上手くいかないことが解りました。 以下のスクリプトで保存及び抽出データに「=」が含まれていても上手く処理する方法は無いでしょうか。 #***************************************************************************** sub plink{ #パーソナルリンク &error("現在、パーソ\ナルリンクは使用出来ません。") if !($personallink); my ($a1,$a2,$a3,%temphash); for $a1(split(/; */,$ENV{'HTTP_COOKIE'})){ ($a2,$a3) = split(/=/,$a1); $a3 =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; if ($a2 eq 'plink_list'){ foreach(split(/<>/,$a3)){ $temphash{$_}=1; } last; } } &filelock("linkdata"); open (IN,"$linkdata"); while(<IN>){ if ($temphash{(split(/<>/,$_))[15]}){ $totalct++; push(@site,$_) if ($totalct >= $startnum) && ($totalct <= $endnum); } } close (IN); &fileunlock("linkdata"); $endnum = $totalct if $totalct < $endnum; $startnum = 0 if $totalct == 0; $action = "パーソ\ナルリンク"; &searchbar("","<option value=\"\" selected>$searchtitle\n"); &databar(); if ($totalct != 0){ $resultmessage = "$totalct件のリンクが登録されています。<br /><br />"; &linkbar("act=$act&line=$line&indi=$indi"); &siteindicate("",@site); }else{ $resultmessage = "登録が無いか、クッキーが有効になっていません。<br /><br />"; $linkbar = $siteindicate = ""; } &html_output; } #***************************************************************************** sub plink_add{ #パーソナルリンク追加 &error("現在、パーソ\ナルリンクは使用出来ません。") if !($personallink); &get_cookie; $plink_list.=$url."<>" if $plink_list !~ /\Q$url\E/; &set_cookie; &searchbar("","<option value=\"\" selected>$searchtitle\n"); $linkbar = $siteindicate = ""; $action = "パーソ\ナルリンク追加"; $resultmessage = "<b>".&sitename_get."</b> をパーソ\ナルリンクに追加しました。<br />"; &html_output; } #***************************************************************************** sub get_cookie{ #クッキー取得 my ($a1,$a2,$a3); for $a1(split(/; */,$ENV{'HTTP_COOKIE'})){ ($a2,$a3) = split(/=/,$a1); $a3 =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; if ($a2 eq 'plink_list'){ $plink_list = $a3; last; } } } #****************************************************************************** sub set_cookie{ #クッキー設定 $plist_link =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; print "Set-Cookie:plink_list=$plink_list; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; } #**************************************************************************** 宜しくお願い致します。

  • Cookieを用いてのセッション管理

    以前も問い合わせさせていただいた件なのですが、 未だ解決していないので、再掲させていただきます。 やりたいことは、 個人認証のページを作り、ログオフ後、ブラウザの戻るボタンを押しても、 ログイン中となるのを避けたい。 以下のような感じで、cookieを使って実現しようとしているのですが、 ログオフ時にcookieの削除は、うまくいったのですが、 ブラウザの戻るボタンでログイン中のページに戻ると、 $ENV{'HTTP_COOKIE'}の中身を見ると、実際にはCookieは削除されているにも関わらず、 Cookieの情報がよみこまれているため、ログイン中となってしまいます。 何か基本的なやり方を間違っているような気がします。 どなたかご教授願います。 ↓a1.cgi(ログイン画面)--------------  : (ID、パスワード認証後) #Cookie書き込み print "Content-type: text/html\n"; print "Set-Cookie: NAME=aaa; expires=Tue, 1-Jan-2030 00:00:00 GMT;\n"; print "\n";  : ↑a1.cgi(ログイン画面)-------------- ↓a2.cgi(ログイン中)--------------  : #Cookie読み込み $cookie01 = "$ENV{'HTTP_COOKIE'}\n";  : <HEAD> <!-- キャッシュクリア --> <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT">  : </HEAD>  : ↑a2.cgi(ログイン中)-------------- ↓a3.cgi(ログオフ)--------------  : #cookie削除。 print "Content-type: text/html\n"; print "Set-Cookie: NAME=aaa; expires=Fri, 31-Dec-1999 23:59:59 GMT;\n"; print "\n";  : </HEAD>  : ↑a3.cgi(ログオフ)-------------- ※a1.cgi、a2.cgi、a3.cgiは同じディレクトリです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • このCGIサブルーチンを解説してください。

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=393199 の続きのようなかんじですが…。 下記のコードがわかりません。 おわかりになるかた解説してください。 sub setCookie{ local($tmp, $val); $val = $_[1]; $val =~ s/(\W)/sprintf("%%%02X", unpack("C",$1))/eg; $tmp = "Set-Cookie:"; $tmp . = "$_[0]=$val;"; $tmp . = "expires=Thu, 1-Jan-2030 00:00:00 GMT\n"; return($tmp); } 1行目:サブルーチン名 2行目:$tmp,$valをそれぞれローカル変数に設定。 3行目:? 4行目:$valを16進数から1バイトずつ変換? 5行目:$tmpに"Set-Cookie:"を代入。 6行目:$tmp.に"$_[0]=$val;"を代入。 7行目:$tmp.に"expires=Thu, 1-Jan-2030 00:00:00 GMT\n"を代入。 8行目:? というところまではなんとか解釈したのですが、「?」の部分がわかりません。 Set-Cookieヘッダを作成しているらしいのですが…。

    • ベストアンサー
    • CGI
  • Cookieがクリアされない

    入力フォームを作っています。 トップのフォームにクッキーをセットして、確認画面→登録完了フォームでクッキーをクリアにしています。 クッキーの登録は全て良いんですが、Cookieは、IEではちゃんとクリアされるんですが、Netscape,Firefoxではクリアされません。 色々試したんですが、お手上げ状態です。 ご教授お願いします。 print "Content-type: text/html\; charset=shift_jis\n"; $CookieSet .= "Set-Cookie: $CookieName=$CookieValue\; expires=$GmtString\;"; print "\n"; print "Content-type: text/html\; charset=shift_jis\n"; $ClearCookie .="Set-Cookie: $CookieName=clear\; expires=$ExpiresTimeString\;";#過去の日付'Thu, 01-Jan-2000 00:00:00 GMT' print "\n";

    • ベストアンサー
    • Perl
  • 次のカウンターのCGIプログラムで間違っているところはどこでしょうか?

    参考書を手にしながら次のようにCGIを作成しましたが、上手く動きません。 個人別カウンター(アクセスしてきた個人ごとにカウンターが変わる)CGIです。 いろいろ調べたのですが、どこが間違っているのか分からなくなりました。 どうぞお願いいたします。 ======= #!/usr/local/bin/perl $cookie = $ENV{'HTTP_COOKIE'}; @array = split(/; /, $cookie); foreach $tmp (@array){ ($key, $value) = split(/=/, $tmp); if($key eq 'count'){ $count = $value; } } if( $key == ""){ $count = 0; } $count++; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(time + 60*60*24*30); @day = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "sat"); @month = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Set", "Oct", "Nov", "Dec"); $expireDate = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT", $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec); print "Content-Type: text/html\n"; print "Set-cookie: count=$count; expires=$expireDate \n\n"; Print "<html>\n"; Print "<title>counter4</title>\n"; print "<body>\n"; print "<h1>個人別カウンター</h1>\n<hr />"; print "あなたは$count回目のご訪問です。\n"; print "</body>\n"; print "</html>"; exit;

    • ベストアンサー
    • CGI
  • クッキー書き込みが正常に行われない?

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=394703 を質問していたものです。 1.フォームで名前を入力 2.1の情報をクッキーに書き込み ということをやりたいのです。 (応用いたしますが、基本はこれです。) 1つ目のcgiで、フォームで名前を入力。 -----1.cgi-------------------- #!/usr/local/bin/perl print "Content-type:text/html\n\n"; print "<form method=post action=2.cgi>\n"; print "<input type=text name=name></input><BR>\n"; print "<input type=submit value=ok></input><BR>\n"; print "</form>\n"; exit; ------------------------------ 1.cgiの名前のデータを呼び込もうとしてもエラーになる。 -----2.cgi-------------------- #!/usr/local/bin/perl read(STDIN,$atai,$ENV{'content_length'}); ($key, $value) = split(/=/, $atai); $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; print &setCookie("name",$value); print "Content-type:text/html\n\n"; print "名前:<FONT COLOR=RED>",$value,"</FONT>と送信されました。<br>\n"; #Cookie書き込み。 sub setCookie{ local($tmp,$val); $val = $_[1]; $val =~ s/(\W)/sprintg("%%%02X",unpack("C",$1))/eg; $tmp="Set-Cookie: "; $tmp .="$_[0]=$val; "; $tmp .="expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; return($tmp); } ------------------------------ クッキー書き込みをしないで実行すると、きちんと名前が表示されます。 どこをなおせばきちんとクッキーにセットされるのでしょうか? 何度も申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • CGI
  • Macでクッキーが呼び出せない

    以下のような遷移を作っております。 ・HtmlファイルにJavaScriptでクッキーを以下のように書き込む。 var no = '01010088'; var img_url = '../01010088i.gif'; var url= '../01010088.html'; var itemname= '日本語商品名'; var price = '7,960'; var souryou = '1';//有料の場合は1 無料の場合は0 setCookie(no,img_url +':' + url + ':' + itemname + ':' + price + ':'+ souryou +':'+ exp2 + ':',exp,limit); function setCookie(key,val,val_exp,val_limit) { tmp = key + "=" + escape(val) + "; "; tmp += "path=/ ;"; if(limit > 0){tmp += "expires= " + val_exp.toGMTString(); + "; ";} document.cookie = tmp; } ・CGIでクッキーを呼び出す。その際UTF-16をデコード処理してSjisにしております。 #クッキーの取得 &getCookieName(); ここにデコード処理を書いております。多いので割愛 sub getCookieName { local($xx, $name, $value); foreach $xx (split(/; */, $ENV{'HTTP_COOKIE'})) { ($name, $value) = split(/=/, $xx); $pure_value = $value; $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; $COOKIE{$name} = $value; push @COOKIE,"$name:$value$pure_value:\n"; } } で実際Windowsで閲覧するとクッキー情報が正常に出力されるのですが、Mac、自社サーバーにアップしたページを見るとOKなのですがあるレンタルサーバーに同じものをアップしてみるとだめなのです。 あいまいな表現ですが、なにかこれだけの情報でなにが原因か事例がありますか? もし不足な情報ならご指示ください。

    • ベストアンサー
    • CGI