根据此question报告的问题,找到了解决方案:
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处理?
答案 0 :(得分:7)
首先要检查几件事:
确保对请求进行操作的所有过滤器也支持异步(如one of the answers中针对您引用的问题所述)。
确保您使用的是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">
答案 1 :(得分:4)
尝试升级。
查看Tomcat 7 ChangeLog以获取完整的详细信息。
另外,如果你想使用async,那么你需要确保链中的所有过滤器和阀门(当然还有servlet)都支持异步。这可能是原始问题以及您的案例中的问题。
答案 2 :(得分:1)
我发现只有当你从一个普通的servlet / jsp(内部)转发到async-servlet时才需要org.apache.catalina.ASYNC_SUPPORTED=true
!
示例:在我的index.jsp中,我嵌入了<jsp:forward page="/path/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-one!由于异步请求功能必须预设!
因此,需要转发到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)
作为预处理过滤器;
希望这可能会有所帮助!