Как избежать запроса набора ASYNC_SUPPORTED = true, чтобы включить обработку асинхронного сервлета 3.0 на Tomcat 7? - PullRequest
13 голосов
/ 22 октября 2011

После сообщения об этой проблеме было найдено решение:

req.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true);

Это кажется немного странным и на самом деле не «переносимым» кодом (это не повредит, но ...). Это похоже на Tomcat 7. Я использую Tomcat 7.0.14, поставляемый NetBeans 7.0.1.

Я не смог найти документацию, указывающую на необходимость включения обработки асинхронных запросов в сервлете 3.0 с атрибутом catalina. Я не смог найти документацию, указывающую, что что-то особенное было необходимо и на уровне конфигурации Tomcat.

Есть ли способ избежать необходимости устанавливать ASYNC_SUPPORTED=true в каждом запросе, чтобы включить обработку асинхронного сервлета 3.0 в Tomcat 7?

Ответы [ 3 ]

7 голосов
/ 24 декабря 2012

Сначала нужно проверить пару вещей:

Убедитесь, что все фильтры, работающие с запросом, также поддерживают асинхронность (как указано в одном из ответов на вопрос, на который вы ссылались).

Убедитесь, что вы используете Servlet 3.0 web.xml - например:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0"
         metadata-complete="true">
4 голосов
/ 28 декабря 2012

Попробуйте обновить.

  • Ошибка 53623 исправлена ​​в 7.0.30.
  • «Включить остальные клапаны для поддержки асинхронной обработки Servlet 3». (исправлено в 7.0.16)

Проверьте Tomcat 7 ChangeLog для получения полной информации.

Кроме того, если вы хотите использовать асинхронный режим, вам необходимо убедиться, что все фильтры и клапаны в цепи (а также сервлет, конечно) поддерживают асинхронный режим. Вероятно, это проблема в исходном вопросе, а также в вашем случае здесь.

1 голос
/ 10 августа 2015

Я обнаружил, что org.apache.catalina.ASYNC_SUPPORTED=true нужен только тогда, когда вы переходите от одного обычного сервлета / jsp (внутри) к асинхронному сервлету!Пример: в мой index.jsp я вставляю <jsp:forward page="/path/AsyncServlet" /> Я обещаю, что AsyncServlet отлично работает как на Tomcat7, так и на Glassfish3, когда я запускаю его прямо из браузера!Однако, когда я запускаю его по index.jsp: Tomcat7 сообщает 500 для «Не поддерживается» Glassfish3 сообщает 500 для «Запрос входит в область действия фильтра или сервлета, который не поддерживает асинхронные операции» Если я встраиваю <% request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); %> до <jsp:forward>в index.jsp Tomcat7 работает нормально, но Glassfish3 все еще ПЛОХО!Таким образом, я нашел решение для Tomcat7 и Glassfish3 (без SYNC_SUPPORTED!): Просто ИСПОЛЬЗУЙТЕ ТОЧНО прикрепить в web.xml следующее:

<servlet>
    <servlet-name>indexPage</servlet-name>
    <jsp-file>/index.jsp</jsp-file>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>indexPage</servlet-name>
    <url-pattern>/index.jsp</url-pattern>
  </servlet-mapping>

Вывод (для меня): Вы НЕ МОЖЕТЕ пересылать с обычного сервлета /JSP / фильтр для асинхронного!Поскольку функция асинхронного запроса ДОЛЖНА быть установлена ​​заранее!Таким образом, общее решение для сервлета / jsp / фильтра, который необходимо перенаправить на асинхронный сервлет: Используйте <servlet>/<async-supported>true или @WebServlet(asyncSupported = true) для предварительно обработанного сервлета;Используйте <servlet>/<async-supported>true для предварительно обработанного jsp. Используйте <filter>/<async-supported>true или @WebFilter(asyncSupported = true) для предварительно обработанного фильтра;Надеюсь, это немного поможет!

...