はじめに
『Javaによる簡易HTTPサーバーの作成』第2回目の今回は、RFC2617で規定されているHTTPのBasic認証およびDigestアクセス認証を、前回作成したHTTPサーバーに実装します。
本記事では
- HTTPの認証の仕組み
- NullObjectパターンの利用
- Javaでメッセージダイジェストを利用する方法
- デファクトスタンダードと仕様の齟齬(そご)の実例
といったトピックを取り上げます。
対象読者
本記事は、Javaプログラミングの初級者から中級者を対象に、J2SEのメッセージダイジェストの利用方法や、NullObjectデザインパターンの利用などについて解説します。
また、HTTPの認証機構や、RFCと現実の実装の差などの、コンピューティングの周辺知識についても簡単に説明します。
必要な環境
本記事のソースをビルド/実行するには、J2SE 1.4以上を利用してください。ソースファイルアーカイブは、直接NetBeans 4.1のプロジェクトとして開けるように構成してありますが、NetBeans 4.1を利用しなくてもコマンドラインからJDKおよびAntを利用してビルドすることもできます。
なお、ソースファイルアーカイブに格納してあるコンパイル済みクラスファイルは、J2SE 1.5.0でビルドしてあります。J2SE 1.4の環境で実行する場合は、再ビルドしてください。
参考までに筆者が利用した本記事のテスト環境は以下のものです。
OS | J2SE | Ant | JUnit | IDE | ブラウザ |
OS X 10.4.2 | 1.5.0_05 | 1.6.2 | 3.8.1 | NetBeans4.1J | Safari |
Windows XP | 1.5.0_05 | 1.6.2 | 3.8.1 | NetBeans4.1J | Firefox 1.0.7/IE6SP2 |
NetBeans 4.1からの利用
メニューから[ファイル]→[プロジェクトを開く]を順に選択し、ソースファイルアーカイブを展開したディレクトリの「httpserver」ディレクトリを選択して、[プロジェクトフォルダを開く]をクリックしてください。
プロジェクトが読み込まれたら、プロジェクトのコンテキストメニュー(ショートカットメニュー)から[プロパティ]をクリックし、[プロジェクトプロパティ]の[プロジェクトの実行]タブを選択して、[作業用ディレクトリ]に展開したディレクトリの「httpserver\html」を設定してください。
以降、プロジェクトのコンテキストメニューから実行、デバッグ、テスト実行が可能となります。
ファイル構成
ダウンロードしたファイルはzipで圧縮してあります。展開すると「httpserver」というディレクトリを頂点としたディレクトリ階層ができます。すぐに実行できるようにコンパイル済みのクラスファイルも添付してあります(ただし、J2SE 5.0を利用しています)。また、ソースファイルは、すべてシフトJISでエンコードしています。
「httpserver」ディレクトリ
build.xml
antのビルドスクリプトです。NetBeans 4.1が生成したファイルですが、コマンドラインからantを利用して操作することも可能です。
主なターゲットに以下のものがあります。
- clean:ビルドしたクラスファイルを削除。
- compile:「src」ディレクトリ下のソースファイルをコンパイル。
- test:「src」および「test」ディレクトリ下のソースファイルをコンパイルして、ユニットテストを実行。なお、testターゲットを実行する場合には
libs.junit.classpath
プロパティで「junit.jar」を指定する必要があります。 - run:「src」ディレクトリ下のソースファイルをコンパイルし実行。
application.args
プロパティで引数を指定することができます。
C:\test\httpserver>ant test -Dlibs.junit.classpath= %JUNIT_HOME%\junit.jar Buildfile: build.xml -pre-init: ... -do-test-run: [junit] done [junit] Testsuite: com.example.http.HttpServerTest [junit] Tests run: 4, Failures: 0, Errors: 0, Time elapsed: 0.482 sec [junit] ------------- Standard Output --------------- [junit] done [junit] ------------- ---------------- --------------- ...
「httpserver\html」ディレクトリ
テスト用のHTMLを格納してあります。「build.xml」のrunを実行する場合、work.dir
プロパティでこのディレクトリをポイントしてください。
「httpserver\nbproject」ディレクトリ
NetBeans 4.1のプロジェクト設定ファイルが格納されています。
「httpserver\src\com\example\http」ディレクトリ
- HttpServer.java
- Authority.java
- Base64Util.java
HttpServer
クラスが利用する認証機構のソースファイルです。「httpserver\test\com\example\http」ディレクトリ
- HttpServerTest.java
実行方法
NetBeans 4.1のプロジェクトのコンテキストメニューから[プロジェクトを実行]をクリックするか、またはコマンドラインから以下のように実行します。
C:\test\httpserver>ant run -Dapplication.args=-d -Dwork.dir=html Buildfile: build.xml ... compile: run:
実行するとデフォルトではポート8800番でサービスを開始します。この時、Digestアクセス認証が有効となっています。そのため、Webブラウザで「http://localhost:8800/index.html」を開こうとすると認証ダイアログが表示されます(図)。
この実装では、ユーザ名とパスワードは固定で
- ユーザ名: web
- パスワード: 2.0
としています。この値をダイアログへ入力すると「index.html」の表示が確認できると思います(筆者が試していないブラウザについては表示できない可能性があります)。
なお、実行時に-d
を指定(ant利用時は-Dapplication.args=-d
と指定)すると、デバッグモードで実行され、標準出力にクライアントからのリクエスト情報などを出力します。
終了するには、Webブラウザで「http://localhost:8800/quit」を開くか、または「index.html」の[終了]をクリックしてください。