プロが教えるわが家の防犯対策術!

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);
}

A 回答 (3件)

cookieをprintしたあとにスリープして待ってるでしょ。



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

ありがとうございます

> 「開いた」ときにcookieを投げる

ですか。

> AjaxでCGIと通信するしかない

ブラウザで完結する方法はないみたいですね。
このcgiではなく他のアプローチを探してみます

お礼日時:2012/05/27 14:24

ていうか、cookieはページを「開いた」ときにブラウザが投げるものだし。

CGIでprintしたあと、いくらスリープしても、そりゃとれない
    • good
    • 0
この回答へのお礼

>CGIでprintしたあと、いくらスリープしても

スリープはprint前ですが。

>cookieはページを「開いた」ときにブラウザが投げるもの

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

お礼日時:2012/05/26 16:58

よくわからず。


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

ありがとうございます。

>ブラウザがcookieを保存していない

cookieの保存状態を随時確認しながら試してますが、cookieは保存されています

お礼日時:2012/05/26 16:54

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