高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1265
Sharing Browser Cookies With Java Applets

Q:Java アプレットがサーバプロセスに対して URLConnections を開くたびに、サーバとの新しいセッションが生成されます。アプレットはなぜホストブラウザからのクッキーを使用しないのでしょうか?

A: Java 1.4.1 Update 1 for Mac OS X 10.2 以前は、Java プラグイン(1.3.1 と 1.4.1)は、それが組み込まれている Web ブラウザとクッキーを共有しませんでした。このため、アプレットの HTTP 接続とブラウザの HTTP 接続は別々のセッションになり、いくつかの Web アプリケーションでは問題となる場合があります。しかし、ブラウザのクッキーをアプレットに強制することによって、この問題を解決できます。これにはコードを変更する必要がありますが、ブラウザや Mac OS X Java(1.3.1 と 1.4.1)のバージョンを問わず信頼できます。

注意: この問題は、Mac OS X 10.3 以上での Java 1.4 のすべてのリリースも含めて、Java 1.4.1 Update 1 for Mac OS X 10.2 の Safari においては存在しません。この Q&A は、Java 1.3 を使い続ける、Safari 以外のブラウザをサポートしようと考えているデベロッパの方のみが対象になります。Mac OS X 10.2 で Java 1.4 を必要としているデベロッパの方は、単にユーザに、「ソフトウェアアップデート」を通じて無償の Java 1.4.1 Update 1 をダウンロードするように要請するだけで構いません。

リスト 1 は、この処理を開始するのに必要な HTML コードを示しています。APPLET タグはすべて JavaScript を使って書かれ、ブラウザのクッキーは、Document.cookie JavaScript プロパティを使ってアプレットに PARAM として書かれます。この単純な HTML と JavaScript は、JSP やサーブレット、またはその他の動的なメカニズムに簡単に挿入できます。

リスト 1. アプレットへのブラウザクッキーの送信

<HTML>
    <BODY>
   
    <SCRIPT LANGUAGE="JavaScript"><!--
// カット&ペーストを行う場合は、次の writeln コードから改行を削除する
      document.writeln("<APPLET codebase=\".\"
        code=\"CookieCommune.class\"
        name=\"CookieCommune\" >");
        document.writeln("<PARAM name=\"browserCookie\"
        value=\"" + document.cookie + "\">");
      document.writeln("</APPLET>");
    --></SCRIPT>

  </BODY>
</HTML>

この処理の 2 つめの部分はアプレット内で行うものです。"Cookie" リクエストプロパティを設定することによって、クッキーのパラメータがフェッチされ、アプレットが作成する必要のある以降のすべての HTTP 接続で使われます。リスト 2 は、このコードがどのように見えるかを示しています。

リスト 2. アプレット内部でのブラウザクッキーの使用

import java.net.*;
  public class CookieCommune extends java.applet.Applet {
    
    private URL serverURL;
    public void init() {
      try {
       serverURL = new URL("http://mystatefulserver.com/talk.cgi");
      } catch (MalformedURLException e) 
      super.init();
    }
    public void start() {
       
      try {
        // クッキーの共有:アプレットのパラメータからブラウザクッキーを取得
        URLConnection conn = serverURL.openConnection();
        // ブラウザクッキーを URLConnection にアタッチ
        conn.setRequestProperty)"Cookie", getParameter("browserCookie"));
      } catch (java.io.IOException e) {}
      // .... クッキーにとって使いやすい新しいアプレット接続を使用
    }
  }

この結果、(問題が初めて認識されることの多い)ブラウザ表示の更新があった場合でも、アプレットをホストしているブラウザと同じクッキー情報がアプレットによって毎回使用されるようになります。ここに示した解決策は、さまざまなサーバアプリケーション、および Mac OS X 10.2 上で Java 1.3.1 または Java 1.4.1 を使用してアプレットを実行する任意のブラウザに適用できます。

ドキュメントの改訂履歴

日付メモ
2004-10-121.4.1 Update 1(Jaguar 用)以降における問題の解決策を記述。
2003-09-11新規ドキュメント

掲載日: 2004-10-12