web-dev-qa-db-ja.com

HTTPステータス405-JSPはGET POSTまたはHEAD

JSP 2.3(Tomcat 8)以降、JSPでサポートされているメソッドはGET POSTまたはHEAD:

https://jcp.org/aboutJava/communityprocess/maintenance/jsr245/245-MR3.htmlhttp://svn.Apache.org/viewvc/Tomcat/trunk/Java/ org/Apache/jasper /servlet/JspServlet.java?view=diff&r1=1497877&r2=1497878&pathrev=1497878

ただし、JSP 2.3の応答は次のとおりであるため、たとえば、例外ハンドラーの場合、例外とisoJSPビューをレンダリングするためにJSPに転送するために使用されるため、互換性のない大きな変更だと思います。

Method Not Allowed
HTTP Status 405 - JSPs only permit GET POST or HEAD 

description The specified HTTP method is not allowed for the requested resource.
Apache Tomcat/8.0.3

RESTおよび例外の場合にSpringHandlerExceptionResolverを使用すると、この問題が確実に発生します。この問題の回避策はありますか(iso change httpメソッドタイプ)?

19
Grigory Kislin

申し訳ありませんが、これに対する回避策は(現時点では)ありません。 EGに対する私の推奨事項は、処理されるメソッドを構成可能にすることでした。その提案は拒否されました。サポートされているメソッドをJSP(またはJSPのグループ)ごとに構成可能にするための良い議論であるため、この特定の問題を提起することをお勧めします。

その間、私はあなたがこれのために提起したバグの下で何らかの形のTomcat固有の構成を使用してこれを構成可能にすることを見ていきます: https://issues.Apache.org/bugzilla/show_bug.cgi?id=56568

更新:Tomcat 8.0.9以降、JSPを使用してエラーページを生成すると、すべてのHTTPメソッドが許可されます。

4
Mark Thomas

@MarkThomasが指摘しているように、JSPページを次のようにHTTPとして宣言すると、任意のerrorPageリクエストを行うことができます。
enter image description here

それをしたくない場合は、もう1つの選択肢があります
1。フィルタを作成するか(JSPページを直接呼び出す場合)、サーブレットを作成します(最終的にはJSPページを呼び出します)。
2。これは、doFilter()で行うか、サーブレットdoPut()/ doDelete()の場合に行います。
enter image description here
ここでは、requestServletRequestオブジェクトであるFilterでこれを行っています。
HttpRequestWrapperを使用して、元のリクエストを偽のリクエストでラップし、返すように指示しています[〜#〜] post [〜#〜]DELETEおよびPUTリクエストの場合、JSPPOSTリクエストと見なし、ページが実行されます。欠点はあなただけです。元のリクエストが何であったかを知ることはできません。このように元のメソッド名で属性を設定すると、これもカバーできます

HttpServletRequest req = (HttpServletRequest) request;
request.setAttribute("method", req.getMethod());
req.getRequestDispatcher("/WEB-INF/resources/" +  resourceName + ".jsp").forward(new HttpServletRequestWrapper(req) {
    @Override
    public String getMethod() {
        String method = super.getMethod();
        if (method.equalsIgnoreCase("delete") || method.equalsIgnoreCase("put")) {
            return "POST";
        } else {
            return method;
        }
    }
}, response);
2
Kainix