如何避免请求设置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使用
或@WebServlet(asyncSupported = true)
; 对预处理的jsp使用
对预处理的
使用
或@WebFilter(asyncSupported = true)
; 希望这可能会有所帮助!