【Struts】HTTPメソッドのGET、POST以外でエラーになる理由

今回は、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など)の処理がデフォルトでは、エラーを返却する実装になっています。

実装内容の詳細は、次のソースコードのリンクから確認することができます。

servlet-spec/src/main/java/javax/servlet/http/HttpServlet.java at master · javaee/servlet-spec
The API and Issue Tracker for the JCP Standard Java Servlet Specification - javaee/servlet-spec

Apache Strutsでリクエストを受け付けるのは、org.apache.struts.action.ActionServletクラスになります。これは、さきほどのクラスを継承したものになります。このクラスは、doGet、doPostメソッドのみを実装しています。他の未実装のメソッドは、javax.servlet.http.HttpServletクラスの処理が実行されるため、エラーを返却する動作になります。

実装内容の詳細は、次のソースコードのリンクから確認することができます。

struts1/core/src/main/java/org/apache/struts/action/ActionServlet.java at trunk · apache/struts1
Mirror of Apache Struts 1. Contribute to apache/struts1 development by creating an account on GitHub.

HTTPメソッドのPUT、DELETEなどのリクエストを受け付けようとしても、フレームワーク側で処理が実装されていないため処理をすることはできません。

まとめ

Apache Struts 1.x系で特定のHTTPメソッドがエラーになる理由を紹介しました。

この問題は、Strutsフレームワークを使用して作成されている、他のフレームワークでも同じ問題が発生する可能性があります。派生したフレームワークの情報としては、次の情報も参考にしてみてください。

Apache Struts - Wikipedia