クッキーに関するちょっとした疑問
フォームを送信するとクッキーが追加される。ただし、実際にやってみるとJSESSIONIDというクッキーが表示されたり、1回前に送信したクッキーまでしか表示されないなど不思議なことが多い。 |
さて、JSPとサーブレットが完成したところで、実際に動作を確かめてみてください。すると、いくつか不思議な点に気がつきます。それらについて簡単に説明しておきましょう。
●「JSESSIONID」ってなに?
クッキーの一覧を表示させると、その最初に「JSESSIONID」という見たことのないクッキーが表示されるはずです(最初に表示されなくとも、リロードしたりフォーム送信後には表示されるはずです)。こんなクッキー、作った記憶はないのに……。
実は、これは「Javaサーバー(サーブレット・コンテナ)」が利用しているクッキーなのです。何のためのものか?というと、これは「セッションの識別用ID」として使われているクッキーなのです。
サーブレット・コンテナでは、セッションを利用してクライアントと接続を保ち続けることができます。が、本来、Webにはそんな機能は用意されていません。どうやってサーバーが「今接続しているのは、さっきアクセスしてきたクライアントと同じ人だな」ということを識別しているのか? それは、このクッキーに保存している値によってなのです。
このクッキーは、setMaxAgeが設定されていません。つまり、接続が切れると失われるものなのです。こうすることで、「接続中だけこのクライアントが誰なのかという情報を保持する」ということを行なっているのですね。ですから、このクッキーを勝手に操作したりするとセッションに影響が出ますので絶対に行なわないようにしましょう。
●送信したクッキーは直後には表示されない?
フォームから新しいクッキーを送信してみてください。なぜか、画面には表示されないはずです。「おかしいな?」と思ってまた送信してみると、前回送信したクッキーが表示されるようになります(新たに送信したものはやっぱり表示されません)。何回やっても同じです。送信した直後には、クッキーは表示されないのです。
これは、「クッキーの情報がどうやってやりとりされているか」ということがわからないと理解するのが難しいでしょう。――クッキーは、常に「クライアントからサーバーに送信される」「サーバーからクライアントに送り返される」ということを繰り返して機能しています。重要なのは「JSPでもサーブレットでも、直接ブラウザにクッキーを保管することはできない」という点です。ですから、送信したフォームの情報がクッキーに保管されるまでには、
クライアントからフォームが送信される
(※ここで現在のクッキー情報がサーバーに送られる)
↓
サーバーからクライアントにクッキー情報が送られる
↓
クライアントにクッキー情報が保管される
(※ここで初めてクライアントにクッキーが追加される)
↓
再びクライアントからサーバーに何か送信される
↓
サーバーで、新たに追加したクッキーが初めて受け取られる
↓
クライアントに新たに追加したクッキー情報が送られる
――こんな形で処理がされていくことになります。なんだかよくわからないかも知れませんが、要するに「クッキー情報を送ったときには、まだクライアントにはそのクッキーは保管されていない。追加後にサーバーに送信されたときにようやく追加したクッキー情報がサーバーで認識される」ということなのです。つまり、「1回ずれる」のですね。