Статус HTTP 405 - JSP разрешают только GET POST или HEAD
Так как 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 change http method type)?
Ответы
Ответ 1
Извините, для этого нет обходного пути (на данный момент). Моя рекомендация EG заключалась в том, что обработанные методы были сконфигурированы. Это предложение было отклонено. Я предлагаю вам поднять эту конкретную проблему с ними, поскольку это хороший аргумент в пользу того, чтобы поддерживаемые методы настраивались на основе JSP (или группы JSP).
В то же время я взгляну на то, чтобы настроить эту конфигурацию, используя определенную конфигурацию Tomcat в соответствии с ошибкой, которую вы подняли для этого: https://issues.apache.org/bugzilla/show_bug.cgi?id=56568
UPDATE: с Tomcat 8.0.9, когда JSP используется для создания страницы с ошибкой, любой HTTP-метод будет разрешен.
Ответ 2
Как указано @MarkThomas, вы можете сделать любой запрос HTTP
, если вы объявите свою страницу JSP как errorPage
, как этот
Если вы не хотите этого делать, есть еще одна альтернатива
1. Создайте фильтр (если вы прямо хотите вызвать страницу JSP
) или создайте сервлет (который в конечном итоге вызовет страницу JSP
)
2. Сделайте это в doFilter() или в случае сервлета doPut()/doDelete()
Здесь я делаю это в фильтре, где request
- объект ServletRequest
.
Я использую 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);