今回は、Apache Struts 1.x系を使用したアプリケーションで、HTTPメソッドのGET、POST以外のリクエストに対してHTTPステータスコードを「400(Bad Request)」、「405(Method Not Allowed)」のエラーが返却される理由について紹介します。
紹介内容は、正式なドキュメントからの情報ではなく、ソースコードから処理を確認した内容になります。
検証環境
検証に使用した環境/ライブラリを次に記載します。
- Apache Struts 1.x
- バージョン:1.3.10
- javax.servlet.servlet-api
- バージョン:2.3.1
原因
リクエストを受け付けるjavax.servlet.http.HttpServletクラスのdoXxxメソッド(doGet、doPostなど)の処理がデフォルトでは、エラーを返却する実装になっています。
実装内容の詳細は、次のソースコードのリンクから確認することができます。
Apache Strutsでリクエストを受け付けるのは、org.apache.struts.action.ActionServletクラスになります。これは、さきほどのクラスを継承したものになります。このクラスは、doGet、doPostメソッドのみを実装しています。他の未実装のメソッドは、javax.servlet.http.HttpServletクラスの処理が実行されるため、エラーを返却する動作になります。
実装内容の詳細は、次のソースコードのリンクから確認することができます。
HTTPメソッドのPUT、DELETEなどのリクエストを受け付けようとしても、フレームワーク側で処理が実装されていないため処理をすることはできません。
まとめ
Apache Struts 1.x系で特定のHTTPメソッドがエラーになる理由を紹介しました。
この問題は、Strutsフレームワークを使用して作成されている、他のフレームワークでも同じ問題が発生する可能性があります。派生したフレームワークの情報としては、次の情報も参考にしてみてください。