Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/84-7782a04c

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

続・『セキュリティ保護のため、このサイトによる、コンピューターへの・・・(省略)』

『セキュリティ保護のため、このサイトによる、コンピューターへの・・・(省略)』
に記した方法だと、ページを開いたが、[DownLoad]ボタンは押下しなかった場合、
サーバのDBにゴミレコードが蓄積してしまう。

また、最初のhtmlを返す時にHTTPヘッダにPragma: no-cache等を付けると、
ブロック後にページをサーバから取り直してのリロードになるので、
サーバ側のカウンターもゼロになり、毎回alertが出てしまう。

早い話が、イケテナイ。

そこで、以下の様に直した。

#!/usr/local/bin/ruby
require 'cgi'
require "erb"

cgi=CGI.new('html3')

if cgi.has_key?('dl') then
cgi.out('status'=>'OK'){'hoge.zip'}
elsif cgi.has_key?('move') then
year=60*60*24*365
cgi.out('status'=>'REDIRECT',
'location'=>cgi['move'],
'cookie'=>CGI::Cookie::new({'name'=> 'move',
'value'=> 'move',
'expires'=> Time.now + (cgi['flg']=='false' ? year : year*-1)
})
){''}
else
cgi.out('status'=>'OK',
'pragma'=>'no-cache',
'cache-control'=>'no-cache,must-revalidate'){
ERB.new(DATA.read).result(binding)
}
end
__END__
<html>
<body>
<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript">
var url = '<%= ENV['SCRIPT_NAME'] %>';
var flg = false;
var cnt = 0;

Event.observe(window,'load',function(ev){
document.cookie.split(';').each(function(c){
if(c.match(/move/)){
flg = true;
var d = new Date();
d.setYear(d.getYear() - 1);
document.cookie = 'move=move;expires=' + d.toGMTString();
}
});
});

function onButtonClick(){
if(window.ActiveXObject && !flg && cnt++ == 0) //注(1)
alert("『セキュリティ保護のため、このサイトによる、このコンピュータへのダウンロードがInternet Explorerによりブロックされました。』\nの表示が出た場合、『ファイルのダウンロード』を選択し、再度[DownLoad]ボタンを押してください。");

new Ajax.Request(url,{
method: "post",
postBody: "dl=true",
onSuccess: function(http){
location.href = url + '?move=' + http.responseText +'&flg=' + flg;
}
});
}
</script>
<form>
<input type="button" onClick="onButtonClick()" value="DownLoad"
</form>
</body>
</html>


注(1)cnt++ == 0 の条件を付けないと、IEのセキュリティの設定で「ファイルのダウンロード時に自動的にダイアログを表示」=有効にするにしたとき、毎回alertされてしまう。

ザックリとした流れを以下に記す。

?ページをロードした時にクッキーを見る。
 有効なクッキーがあれば、フラグをONに。(ブロックされた直後でなければ有効なクッキーは無い)

?ボタンが押された時にフラグがOFFならば、alertする。

?Ajax.Requestのレスポンスで取得したパスと、フラグをlocation.hrefのクエリに付ける。

?受けたcgiは、クライアントから送ってきたフラグに応じて、クッキーのexpiresを設定し、
 クライアントから送ってきたパスにREDIRECTのレスポンスを返す。
 (フラグがOFFならば、クッキーを有効に、ONならば無効に)

?cgiのレスポンスを受けると、初回のブロックなら、REDIRECT先に飛ばずに、
 ページをサーバから取得するところからやり直すのだが、クッキーは保存される。

初回なら?へ 初回でないなら、ダウンロードのダイアログが現れる。



のよりは短く書けた。

クッキーを書き込んだ直後にIEがフリーズした場合などは、Ctrl+Alt+delもしくは電源長押しして復旧後に、
ページに再度アクセスしてのボタンを押下時は、alertが出てくれない事もあろうかと思うが、それは、制限事項ってことで。

この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/84-7782a04c

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。