Servlets 支持的Servlet 3.0异步不起作用

Servlets 支持的Servlet 3.0异步不起作用,servlets,asynchronous,servlet-filters,Servlets,Asynchronous,Servlet Filters,这是我的web.xml <filter> <filter-name>pollingTest</filter-name> <filter-class> webapp.controller.core.servlet.PollingService </filter-class> <async-supported>true</async-supported

这是我的web.xml

    <filter>
    <filter-name>pollingTest</filter-name>
    <filter-class>
        webapp.controller.core.servlet.PollingService
            </filter-class>
    <async-supported>true</async-supported>
</filter>
<filter-mapping>
    <filter-name>pollingTest</filter-name>
    <url-pattern>/app/poll</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>ASYNC</dispatcher>
</filter-mapping>
}

我在glassfish和tomcat 7上运行了它,得到了异常:

java.lang.IllegalStateException: Request is within the scope of a filter or servlet that does not support asynchronous operations
at org.apache.catalina.connector.Request.startAsync(Request.java:3657)
at org.apache.catalina.connector.Request.startAsync(Request.java:3633)
at org.apache.catalina.connector.RequestFacade.startAsync(RequestFacade.java:1053)
at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:450)

谁能在这件事上帮我?非常感谢。

因为您的servlet和链中的任何其他筛选器必须在web.xml中具有
true

您正在递归调用
此.doFilter(req、res、chain)


如果要继续链,必须调用
chain.doFilter(httpRequest,httpResponse)
而不是
这个.doFilter(req、res、chain)

我也有类似的问题,但就我而言,这还不够。如果使用标记上下文和阀门(在tomcat7-service.xml中),则必须在标记值中添加参数asyncSupported=“true”。然后它成功了

<Context docBase="aaa" path="/aaa" reloadable="true" source="org.eclipse.jst.jee.server:aaa"><Valve className="cz.tomcatUtil.ForceUserValve" user="DZC0GRP" asyncSupported="true"/></Context>

我知道这是一篇老文章,但我想与大家分享我的解决方案。我花了一个星期才找到原因,因为我几乎尝试了所有可能的解决办法

对我来说,servlet url模式是不正确的

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/pattern/</url-pattern> <---
  </servlet-mapping>

MyServlet

/彼得·卡拉比诺维奇,你的回答不是真的。来自Servlet 3.0规范:

2.3.3.3异步处理

从asyncSupported=true的servlet调度到 asyncSupported设置为false,则允许。在这种情况下,响应将是 当不支持异步的servlet的服务方法 退出


您可以使用注释来映射异步Servlet,如下所示

@WebServlet(urlPatterns = {"/yourServlet"}, **asyncSupported=true**)

public class YourServlet extends HttpServlet { }

显示整个web.xml(至少是带有名称空间的
标记定义)如何使用注释执行此操作?@WebFilter(urlPatterns=“/*”,asyncSupported=true)Netbeans 8.2/Tomcat 8.0.27:我还必须禁用HTTP监视器(服务->服务器->右键单击Apache Tomcat->属性->取消选中启用HTTP监视器)。它看起来像是一个.per Servlet 4.0规范:“…如果请求在不支持异步操作的Servlet或筛选器的范围内,则调用startAsync是非法的…”
@WebServlet(urlPatterns = {"/yourServlet"}, **asyncSupported=true**)

public class YourServlet extends HttpServlet { }