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

Как избежать набора запросов ASYNC_SUPPORTED = true для включения обработки async сервлета 3.0 на Tomcat 7?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Убедитесь, что вы используете веб-сайт 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">

Ответ 2

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

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

Подробнее см. Tomcat 7 ChangeLog.

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

Ответ 3

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