クッキーは主にCGIなどのウェブプログラムで読み書きするものですが、JAVAスクリプトでも利用する事が出来ます。
ここでは、JAVAスクリプトだけでクッキーを扱う方法を簡単な例を挙げて解説します。
今、JAVAスクリプトを有効にした場合、この後に以下の文字列が表示されるでしょう。
このクッキーを読み書きするスクリプト「Cookie.js」の内容は以下のようになっております。
// クッキーを焼く。function set_cookie(nam,val,exp) {var i;// 値の設定。var str=nam+'='+escape(val);// 有効期限の計算。if (exp!=0) {i=new Date()i=i.getTime();i=new Date(i+(60*60*24*1000*exp));str+='; expires= '+i.toGMTString();}// クッキー焼き。document.cookie=str;}// クッキーから特定のキーの値を受け取る。function get_cookie(nam) {var ck=document.cookie.split('; ');var i=-1;var j,k;while (++i<ck.length) {j=ck[i].split('=');if (j[0]==nam) return(unescape(j[1]));}return('');}// 前回アクセス時刻を収めたクッキーを読み込む。var la=get_cookie('lastaccessed');// 読み込んだ値を返す。if (la!='') {document.write('<ul><li>'+la+'</li></ul>');}else {document.write('<ul><li>今回初めてのアクセスですね。</li></ul>');}// 前回アクセス時刻を収めるクッキーを更新する。 // 日付文字列を作る。var tm=new Date();var yr=tm.getYear();var mo=tm.getMonth()+1;var dt=tm.getDate();var hr=tm.getHours();var mn=tm.getMinutes();var sc=tm.getSeconds();if (mo<10) { mo='0'+mo; }if (dt<10) { dt='0'+dt; }if (hr<10) { hr='0'+hr; }if (mn<10) { mn='0'+mn; }if (sc<10) { sc='0'+sc; }if (yr>=1970) { yr-=1988 }else { yr-=88; }la='前回のアクセスは 平成'+yr+'年'+mo+'月'+dt+'日 '+hr+'時'+mn+'分'+sc+'秒でした。';// lastaccessedと言う名前の満30日間有効なクッキーに変数laの値を設定する。set_cookie('lastaccessed',la,30);
このクッキー読み書きスクリプトは大きく分けて三つに分かれます。
一番目の処理は、実際にクッキーを焼く(発行する)処理を纏めたset_cookie()函数です。
その内容は以下のようになります。
// クッキーを焼く。function set_cookie(nam,val,exp) {var i;// 値の設定。var str=nam+'='+escape(val);// 有効期限の計算。if (exp!=0) {i=new Date()i=i.getTime();i=new Date(i+(60*60*24*1000*exp));str+='; expires= '+i.toGMTString();}// クッキー焼き。document.cookie=str;}
ここでは、クッキー名と、それに対応する値を先ず設定するようにしております。
詳しくはdocument.cookieプロパティの解説にて解説しておりますが、日本語の文字列などはそのままではクッキーにする事は出来ず、escape()函数でURLエンコードを行う必要があります。
続いて、有効期限の設定です。
ブラウザのセッション期間のみ有効なクッキーの場合は日数を0にし、クッキーを即時抹消する場合は負の日数を指定します。
有効期限は決められた形式で書かなければならないため、以下の手順を追っております。
最後にdocument.cookieプロパティにクッキー文字列を代入する事で当該クッキーを更新します。
二番目の処理は、実際に食べた(読み込んだ)クッキーから特定の名前のクッキーの値を取り出す処理を纏めたget_cookie()函数です。
その内容は以下のようになります。
// クッキーから特定のキーの値を受け取る。function get_cookie(nam) {var ck=document.cookie.split('; ');var i=-1;var j,k;while (++i<ck.length) {j=ck[i].split('=');if (j[0]==nam) return(unescape(j[1]));}return('');}
先ず、document.cookieプロパティで読み込んだクッキーをsplit()メソッドで個々のクッキーに分割します。
個々のクッキーは「; 」で区切られているため、split(; )メソッドで文字列型の配列に変換する事が出来ます。
続いて、この中から引数で指定された名前のクッキーを見つけ出します。
これは配列ですので零番目から最後の要素まで(最後の要素の添字はlengthプロパティの値から 1を引いたものです)順番に診て行く事になります。
クッキーは「名前=値」と言うフォーマットになっておりますので、split(=)メソッドで名前と値に分割します。
そして名前(零番目の要素)が引数と一致する場合、その値(一番目の要素)を値として返しますが、set_cookie()函数でも申し上げた通り、日本語文字を含む場合などはescape()函数でURLエンコードを行う必要があるため、読み出し時にはその逆の処理・URLデコードを行う必要があります。
これには、unescape()函数を使えば良いだけの話しです。
全部のクッキーを調べたにも拘らず、該当する名前のクッキーが無かった場合には、空文字列を返すようにしております。
今までの処理でJAVAスクリプトでもクッキーの取扱いが可能になりました。
ここから、実際にクッキーを利用する処理に入ります。
その内容は以下の通りです。
// 前回アクセス時刻を収めたクッキーを読み込む。var la=get_cookie('lastaccessed');// 読み込んだ値を返す。if (la!='') {document.write('<ul><li>'+la+'</li></ul>');}else {document.write('<ul><li>今回初めてのアクセスですね。</li></ul>');}// 前回アクセス時刻を収めるクッキーを更新する。 // 日付文字列を作る。var tm=new Date();var yr=tm.getYear();var mo=tm.getMonth()+1;var dt=tm.getDate();var hr=tm.getHours();var mn=tm.getMinutes();var sc=tm.getSeconds();if (mo<10) { mo='0'+mo; }if (dt<10) { dt='0'+dt; }if (hr<10) { hr='0'+hr; }if (mn<10) { mn='0'+mn; }if (sc<10) { sc='0'+sc; }if (yr>=1970) { yr-=1988 }else { yr-=88; }la='前回のアクセスは 平成'+yr+'年'+mo+'月'+dt+'日 '+hr+'時'+mn+'分'+sc+'秒でした。';// lastaccessedと言う名前の満30日間有効なクッキーに変数laの値を設定する。set_cookie('lastaccessed',la,30);
まず、get_cookie('lastaccessed')函数で、'lastaccessed'と言う名前のクッキーを読み出します。
続いて、'lastaccessed'クッキーの内容に合わせてHTMLを書き出します。
その後、今回のアクセス時刻を日本語形式の文字列にして変数laに代入します。
そして最後にその時刻文字列をset_cookie('lastaccessed',la,30)函数で有効期間満30日の'lastaccessed'クッキーとして焼直します。
クッキーをJAVAスクリプトで扱う場合、以下の点に注意して下さい。
クッキーから書き出した日本語文字列を他の日本語文字列と連結させて表示させると、文字化けが起こる場合があります。
これはクッキーを扱う際に文字列がユニコードに変換される事に依ります。
このため、HTMLに書き出すクッキーは最低でも日本語部分を全部クッキーに入れるやる必要があります。
尚、実際にクッキーを扱う処理ではHTMLのタグと連結して出力しておりますが、HTMLのタグはアスキィ文字なのでクッキーから得た日本語文字列と混ぜても文字化けの原因にはなりません。
実際問題としては、クッキーをJAVAスクリプトで扱う必要があると言うケースは余り多くはないでしょう。
よく、今までの訪問回数をクッキーに記録していちいち表示させると言うのがJAVAスクリプトでのクッキー応用例として見られますが、正直そのような処理は閲覧者から見たら何の意味も無いでしょう。
考えられる実用性のある用途としては、以下のようなものが挙げられます。
また、複数言語版を持つサイトなら、そのうちのいずれかが撰ばれる事でしょう・
メニューページでいつも見るコンテンツのトップページをクッキーに登録しておく事で、メニューページに入ったら自動的に当該コンテンツにリダイレクトするように出来るでしょう。
もっとも、これを実現しようとするとかなりマメな更新が求められます。
また、スクリプト自身もかなり大掛かりなものになりそうです。
但し、その場合認証用のパスワードをそのままクッキーに入れると、アクセスの度にクッキーの内容すなわちパスワードが筒抜けになる恐れがあります。
また、いい加減なクッキーだと簡単に認証を破られてしまうでしょう。
JAVAスクリプトでも復号が極めて困難な暗号アルゴリズムをコーディングする事は可能ですので、それを用いると良いでしょう。
Copyright ©平成19年-平成24年 さいたま・しらぎくさいと 版権所有
marguerite.site@gmail.com