Servlet 3.0异步支持不起作用

Ben*_*Ben 24 asynchronous servlets servlet-filters

这是我的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>
Run Code Online (Sandbox Code Playgroud)

这是班级:

public class PollingService implements Filter {
Logger logger = LoggerFactory.getLogger(getClass());

@Override
public void destroy() {
    logger.info("Destroy");
}

@Override
public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {

    logger.info("Running");
    req.startAsync(req, res);
    this.doFilter(req, res, chain);
    return;
}

@Override
public void init(FilterConfig arg0) throws ServletException {

    logger.info("Init=");
}
Run Code Online (Sandbox Code Playgroud)

}

我在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)
Run Code Online (Sandbox Code Playgroud)

谁可以帮我这个?非常感谢.

小智 49

因为您的servlet和链中的任何其他过滤器必须具有<async-supported>true</async-supported>web.xml.

  • @WebFilter(urlPatterns ="/*",asyncSupported = true) (7认同)

小智 5

我有类似的问题,但就我而言,这还不够.如果使用标签Context和Valve(在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>
Run Code Online (Sandbox Code Playgroud)