Подтвердить что ты не робот

Статус 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)?

4b9b3361

Ответ 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);