HTTP状态405 - JSP仅允许GET POST或HEAD

时间:2014-05-27 10:23:05

标签: jsp tomcat exception-handling tomcat8

由于JSP 2.3(Tomcat 8)仅支持JSP的方法是GET POST或HEAD:

https://jcp.org/aboutJava/communityprocess/maintenance/jsr245/245-MR3.html http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/servlet/JspServlet.java?view=diff&r1=1497877&r2=1497878&pathrev=1497878

但是,我想,这是一个很大的不兼容的变化,例如,异常处理程序用于转发到JSP以呈现异常和iso JSP视图,因为JSP 2.3响应是:

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和Spring HandlerExceptionResolver,我们肯定会碰到这个问题。是否有解决此问题的方法(iso更改http方法类型)?

2 个答案:

答案 0 :(得分:3)

抱歉,目前没有解决方法(目前)。我对EG的建议是处理方法是可配置的。该建议遭到拒绝。我建议你提出这个问题,因为它是一个很好的论据,可以在每个JSP(或JSP组)的基础上配置支持的方法。

与此同时,我将根据您为此提出的错误,使用某种形式的Tomcat特定配置来查看此可配置:https://issues.apache.org/bugzilla/show_bug.cgi?id=56568

更新:从Tomcat 8.0.9开始,当使用JSP生成错误页面时,将允许任何HTTP方法。

答案 1 :(得分:0)

正如@MarkThomas指出的那样,如果您将JSP页面声明为HTTP,则可以发出任何errorPage请求。 enter image description here

如果你不想这样做,那么还有一个选择 1.创建一个过滤器(如果您直接想要调用JSP页面)或创建一个servlet(最终将调用JSP页面)
2.在doFilter()或servlet doPut()/ doDelete()的情况下执行此操作 enter image description here
在此处,我将在requestServletRequest对象的过滤器中执行此操作 我使用HttpRequestWrapper用假请求包装原始请求并告诉它返回 POST 以查找DELETEPUT请求{{1认为它是一个JSP请求并且页面被执行,只有缺点是你不能告诉原始请求是什么;如果您使用原始方法名称设置属性(例如此

),也可以使用此功能
POST