13

在这个问题上报告了一个问题后,找到了一个解决方案:

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

这似乎有点奇怪,并不是真正的“可移植”代码(它不会受到伤害,但是......)。它似乎特定于 Tomcat 7。我使用的是 NetBeans 7.0.1 提供的 Tomcat 7.0.14。

我找不到表明有必要在 servlet 3.0 中使用 catalina 属性启用异步请求处理的文档。我也找不到说明在 Tomcat 配置级别也需要一些特殊的文档。

有没有办法避免ASYNC_SUPPORTED=true在每个请求中设置以在 Tomcat 7 中启用异步 servlet 3.0 处理?

4

3 回答 3

7

首先要检查几件事:

确保对请求进行操作的任何过滤器也支持异步(如您引用的问题的答案之一中所述)。

确保您使用的是 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">
于 2012-12-24T15:57:56.693 回答
4

尝试升级。

  • 错误 53623在 7.0.30 中修复。
  • “为 Servlet 3 异步处理支持启用剩余的阀门。” (在 7.0.16 中修复)

检查Tomcat 7 更改日志以获取完整的详细信息。

此外,如果您想使用异步,那么您需要确保链中的所有过滤器和阀门(当然还有 servlet)都支持异步。这可能是原始问题以及您的案例中的问题,here。

于 2012-12-28T15:15:36.417 回答
1

我发现org.apache.catalina.ASYNC_SUPPORTED=true只有当您从一个 normal-servlet/jsp(内部)转发到一个 async-servlet 时才需要这样做!示例:在我的 index.jsp 中<jsp:forward page="/path/AsyncServlet" /> ,当我直接从浏览器触发 AsyncServlet 时,我保证 AsyncServlet 在 Tomcat7 和 Glassfish3 上都能正常工作!但是,当我通过 index.jsp 触发它时:Tomcat7 报告 500 表示“不支持” Glassfish3 报告 500 表示“请求在不支持异步操作的过滤器或 servlet 范围内”如果我<% 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>

结论(对我来说):你不能从一个普通的servlet/jsp/filter 转发到一个异步的!由于必须预设异步请求功能!因此,对于需要转发到 async-servlet 的 servlet/jsp/filter 的常见解决方案是: 使用<servlet>/<async-supported>true@WebServlet(asyncSupported = true)用于预处理的 servlet;用于<servlet>/<async-supported>true预处理的 jsp 使用<filter>/<async-supported>true@WebFilter(asyncSupported = true)用于预处理的过滤器;希望这可能会有所帮助!

于 2015-08-10T03:56:56.573 回答