Java ServletのHttpServlet#doOptionsメソッド完全ガイド!初心者でもわかるOPTIONSリクエストの基本と使い方
生徒
「ServletでブラウザがどんなHTTPメソッドを使えるか確認する方法ってありますか?」
先生
「はい、それにはOPTIONSリクエストを使います。JavaのHttpServletクラスではdoOptions()メソッドで処理できますよ。」
生徒
「OPTIONSってあまり聞いたことないんですが、実際にどう使うんですか?」
先生
「それでは、doOptions()の役割や使い方を詳しく見ていきましょう。」
1. doOptionsメソッドとは
doOptions()メソッドは、JavaのHttpServletクラスでHTTPのOPTIONSリクエストを処理するために用意されたメソッドです。
OPTIONSは、あるリソースに対してどのHTTPメソッド(GET、POST、PUT、DELETEなど)が許可されているかを確認するために使われます。
主にCORS(クロスオリジンリソースシェア)やREST APIの開発時に使用され、クライアントが事前にサーバーの対応状況を把握する目的で利用されます。
2. OPTIONSリクエストの用途と特徴
OPTIONSリクエストは、以下のような用途で使われます。
- 対応しているHTTPメソッドの確認
- CORSの事前検証(プリフライトリクエスト)
- API仕様の確認
特にモダンなWebアプリケーションでは、JavaScriptが他ドメインのAPIを利用することが増えており、そのときにOPTIONSリクエストが自動的に送られる場合があります。
3. doOptionsの基本的な実装方法
doOptions()メソッドをServletでオーバーライドすると、どのHTTPメソッドが利用可能かをレスポンスヘッダーで明示することができます。
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class OptionsServlet extends HttpServlet {
@Override
protected void doOptions(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setHeader("Allow", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "Content-Type");
}
}
このコードでは、対応するHTTPメソッドをAllowヘッダーに指定し、CORSに必要なヘッダーも付け加えています。
4. AllowヘッダーとCORSの設定
Allowヘッダーは、クライアントに対してこのエンドポイントで利用可能なHTTPメソッドを伝える重要な情報です。
また、CORS対応のためには、次のようなヘッダーが必要になることがあります。
Access-Control-Allow-Origin:どのドメインからのアクセスを許可するかAccess-Control-Allow-Methods:許可するHTTPメソッドの一覧Access-Control-Allow-Headers:許可するリクエストヘッダー
これらの設定がないと、ブラウザからのAjax通信がブロックされてしまうことがあります。
5. OPTIONSリクエストの実行例
OPTIONSリクエストはcurlコマンドを使って簡単にテストできます。
curl -X OPTIONS -i http://localhost:8080/myapp/options
このリクエストを実行すると、レスポンスヘッダーにAllowなどの情報が含まれていることを確認できます。
6. doOptionsが使われるユースケース
doOptions()メソッドは次のような場面で活躍します。
- Java ServletによるREST API開発
- JavaScriptやAjaxとの連携時のCORS制御
- SPA(シングルページアプリケーション)とJavaバックエンドの連携
- フロントエンドとの事前通信確認
特にAPI設計において、CORS設定がうまくいかないと、クライアント側で通信エラーが発生するため、doOptions()の正しい実装が重要です。
7. HttpServletのdoOptionsのデフォルト動作
HttpServletクラスでは、doOptions()がデフォルトで実装されており、自動的にAllowヘッダーを生成します。
ただし、自分でdoGet()やdoPost()などをオーバーライドした場合、それがOPTIONSのレスポンスに反映されないことがあります。
そのため、明示的にdoOptions()をオーバーライドして、最新の仕様に合わせたヘッダーを返すのが望ましいです。
8. セキュリティ上の注意点
doOptions()でCORS設定を緩くしすぎると、セキュリティ上のリスクが生じることがあります。
たとえば、Access-Control-Allow-Originを*に設定すると、すべての外部サイトからアクセス可能になります。そのため、実際のサービスでは必要なドメインだけを指定するのがベストです。
また、Access-Control-Allow-Headersに認証情報などを含める場合には慎重に設計しましょう。