如何避免请求设置ASYNC_SUPPORTED = true以在Tomcat 7上启用异步servlet 3.0处理?

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

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处理?

首先要检查几件事:

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

确保您使用的是Servlet 3.0 web.xml – 例如:

  

尝试升级。

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

查看Tomcat 7 ChangeLog以获取完整的详细信息。

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

我发现只有当你从一个普通的servlet / jsp(内部)转发到async-servlet时才需要org.apache.catalina.ASYNC_SUPPORTED=true ! 示例:在我的index.jsp中,我嵌入了我保证AsyncServlet在Tomcat7和Glassfish3上运行正常,当我直接从浏览器触发它时! 但是当我通过index.jsp触发它时:Tomcat7报告500为“不支持”Glassfish3报告500“请求是在不支持异步操作的filter或servlet的范围内”如果我嵌入<% request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); %> 在index.jsp中的 <% request.setAttribute("org.apache.catalina.ASYNC_SUPPORTED", true); %>之前,Tomcat7正常,但Glassfish3仍然很糟糕! 所以我找到了Tomcat7和Glassfish3的解决方案(没有SYNC_SUPPORTED!):只需在web.xml中正确附加以下内容:

  indexPage /index.jsp true   indexPage /index.jsp  

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