这是我的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>
这是班级:
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=");
}
}
我在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)
谁可以帮我这个?非常感谢。
答案 0 :(得分:49)
因为你的servlet和链中的任何其他过滤器必须在web.xml中有<async-supported>true</async-supported>
。
答案 1 :(得分: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>
答案 2 :(得分:4)
您正在递归this.doFilter(req, res, chain);
。
如果您想继续连锁,则必须调用chain.doFilter(httpRequest, httpResponse);
而不是this.doFilter(req, res, chain);
。
答案 3 :(得分:3)
您可以像这样使用Annotation for Mapping Asynchronous Servlet
@WebServlet(urlPatterns = {"/yourServlet"}, **asyncSupported=true**)
public class YourServlet extends HttpServlet { }
答案 4 :(得分:2)
彼得卡拉比诺维奇,你的回答并非如此。从Servlet 3.0规范:
2.3.3.3异步处理
...
从具有asyncSupported = true的servlet调度到其中一个 asyncSupported设置为false 允许。在这种情况下,响应将是 在不支持异步的servlet的服务方法时提交 退出...
答案 5 :(得分:0)
我知道这是一篇旧帖子,但我想分享我的解决方案。我花了一周的时间才找出原因,因为我几乎尝试了所有可能的解决方案。
对我来说,servlet url-pattern不正确。
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/pattern/</url-pattern> <---
</servlet-mapping>
希望它会有所帮助。