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メソッドタイプ)?
申し訳ありませんが、これに対する回避策は(現時点では)ありません。 EGに対する私の推奨事項は、処理されるメソッドを構成可能にすることでした。その提案は拒否されました。サポートされているメソッドをJSP(またはJSPのグループ)ごとに構成可能にするための良い議論であるため、この特定の問題を提起することをお勧めします。
その間、私はあなたがこれのために提起したバグの下で何らかの形のTomcat固有の構成を使用してこれを構成可能にすることを見ていきます: https://issues.Apache.org/bugzilla/show_bug.cgi?id=56568
更新:Tomcat 8.0.9以降、JSPを使用してエラーページを生成すると、すべてのHTTPメソッドが許可されます。
@MarkThomasが指摘しているように、JSPページを次のようにHTTP
として宣言すると、任意のerrorPage
リクエストを行うことができます。
それをしたくない場合は、もう1つの選択肢があります
1。フィルタを作成するか(JSP
ページを直接呼び出す場合)、サーブレットを作成します(最終的にはJSP
ページを呼び出します)。
2。これは、doFilter()で行うか、サーブレットdoPut()/ doDelete()の場合に行います。
ここでは、request
がServletRequest
オブジェクトであるFilterでこれを行っています。HttpRequestWrapper
を使用して、元のリクエストを偽のリクエストでラップし、返すように指示しています[〜#〜] post [〜#〜]DELETE
およびPUT
リクエストの場合、JSP
はPOST
リクエストと見なし、ページが実行されます。欠点はあなただけです。元のリクエストが何であったかを知ることはできません。このように元のメソッド名で属性を設定すると、これもカバーできます
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);