堀北真希うさぎ
主な作品
堀北真希ちゃんのボシュロム社コンタクト用品TVCM出演に因んで描いた、レンズを着けている堀北真希うさぎのイラストと仮想CM動画

ページ案内

JAVAスクリプトでのクッキー。

クッキーは主にCGIなどのウェブプログラムで読み書きするものですが、JAVAスクリプトでも利用する事が出来ます。

ここでは、JAVAスクリプトだけでクッキーを扱う方法を簡単な例を挙げて解説します。

JAVAスクリプトでのクッキー・目次。

クッキーを読み書きするサンプルスクリプト。

今、JAVAスクリプトを有効にした場合、この後に以下の文字列が表示されるでしょう。

初めてこのページにアクセスされた場合
前回のアクセスが30日以上前の場合
クッキーが有効でないかクッキーを削除している場合
今回初めてのアクセスですね。と表示されます。
その他の場合
前回のアクセス日時が表示されます。

クッキーを読み書きするスクリプトの内容。

このクッキーを読み書きするスクリプト「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);

クッキーを読み書きするスクリプトの実際の構成。

このクッキー読み書きスクリプトは大きく分けて三つに分かれます。

  1. クッキーを焼く(発行する)函数・set_cookie()函数
  2. 食べた(読み込んだ)クッキーから特定の名前のものを取り出す函数・get_cookie()函数
  3. クッキーを食べて内容に合わせた表示を行って、その上でクッキーを更新する処理

クッキーを焼く(発行する)函数・set_cookie()函数。

一番目の処理は、実際にクッキーを焼く(発行する)処理を纏めた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;
}

先ず、クッキーの値を変数strに入れるようにしております。

ここでは、クッキー名と、それに対応する値を先ず設定するようにしております。

詳しくはdocument.cookieプロパティの解説にて解説しておりますが、日本語の文字列などはそのままではクッキーにする事は出来ず、escape()函数でURLエンコードを行う必要があります。

続いて、有効期限の設定です。

ブラウザのセッション期間のみ有効なクッキーの場合は日数を0にし、クッキーを即時抹消する場合は負の日数を指定します。

有効期限は決められた形式で書かなければならないため、以下の手順を追っております。

  1. 先ず、現在時刻をgetTime()メソッドで取得します。
  2. 続いて、その時刻から指定された有効日数を加えた時刻を計算してその値をgetTime()メソッドで取得します。
  3. 最後に、それをtoGMTStringに依ってクッキーで扱える国際協定時の文字列に変換したものをクッキーの書式に合わせた文字列にしてクッキー文字列に連結します。

最後にdocument.cookieプロパティにクッキー文字列を代入する事で当該クッキーを更新します。

食べた(読み込んだ)クッキーから特定の名前のものを取り出す函数・get_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スクリプトで扱う場合の注意事項。

クッキーをJAVAスクリプトで扱う場合、以下の点に注意して下さい。

クッキーから読み込んだ日本語文字列を扱う場合の注意事項。

クッキーから書き出した日本語文字列を他の日本語文字列と連結させて表示させると、文字化けが起こる場合があります。

これはクッキーを扱う際に文字列がユニコードに変換される事に依ります。

このため、HTMLに書き出すクッキーは最低でも日本語部分を全部クッキーに入れるやる必要があります。

尚、実際にクッキーを扱う処理ではHTMLのタグと連結して出力しておりますが、HTMLのタグはアスキィ文字なのでクッキーから得た日本語文字列と混ぜても文字化けの原因にはなりません。

そもそも、JAVAスクリプトでクッキーを扱う必要があるのか?

実際問題としては、クッキーをJAVAスクリプトで扱う必要があると言うケースは余り多くはないでしょう。

よく、今までの訪問回数をクッキーに記録していちいち表示させると言うのがJAVAスクリプトでのクッキー応用例として見られますが、正直そのような処理は閲覧者から見たら何の意味も無いでしょう。

考えられる実用性のある用途としては、以下のようなものが挙げられます。

よく見るコンテンツを登録する
規模の大きなサイトであれば、閲覧者の中には特定の一コンテンツのみを閲覧すると言う事もあるでしょう。

また、複数言語版を持つサイトなら、そのうちのいずれかが撰ばれる事でしょう・

メニューページでいつも見るコンテンツのトップページをクッキーに登録しておく事で、メニューページに入ったら自動的に当該コンテンツにリダイレクトするように出来るでしょう。

更新されたコンテンツを案内出来るようにする
予め最終アクセス時刻を登録しておき、一方でコンテンツの更新状況をJAVAスクリプトで扱えるデータにして最終アクセス時刻以後に更新されたページを一覧として挙げると言う使い方も出来るでしょう。

もっとも、これを実現しようとするとかなりマメな更新が求められます。

また、スクリプト自身もかなり大掛かりなものになりそうです。

認証を維持する
認証制のページの場合、いちいち認証するのは大変ですので、認証済みである事をクッキーに登録するという使い方もあります。

但し、その場合認証用のパスワードをそのままクッキーに入れると、アクセスの度にクッキーの内容すなわちパスワードが筒抜けになる恐れがあります。

また、いい加減なクッキーだと簡単に認証を破られてしまうでしょう。

JAVAスクリプトでも復号が極めて困難な暗号アルゴリズムをコーディングする事は可能ですので、それを用いると良いでしょう。

しらぎくのウェブサイト作成入門サイトマップ



marguerite.site@gmail.com