本人使用tomcat7.0.64 ,jdk1.8完成配置。
如果使用ShiroFilter,那么还要加入:<dispatcher>ASYNC</dispatcher>
以上是springmvc使用的基本配置,如果是普通servlet,配置是一样的。只要异步用到的servlet,filter都需要增加<async-supported>true</async-supported>配置。应用的配置都一样,没什么特殊的。
1.tomcat版本
要使用支持servlet3.0标准的tomcat,这是异步请求的基本要求
2.配置应用程序,在servlet和filter中都配置<async-supported>true</async-supported>标记,类似如下:
<servlet>
<description>spring mvc servlet</description>
<servlet-name>spring_mvc_dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:META-INF/spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
如果使用ShiroFilter,那么还要加入:<dispatcher>ASYNC</dispatcher>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ASYNC</dispatcher>
</filter-mapping>
以上是springmvc使用的基本配置,如果是普通servlet,配置是一样的。只要异步用到的servlet,filter都需要增加<async-supported>true</async-supported>配置。应用的配置都一样,没什么特殊的。
3.其他配置
如果以上两步都做完了,还有Async support must be enabled on a servlet and for all filters的这种错误,意思大致还是没有配置。就要找其他原因了。
例如,我遇到过一个问题,uat环境的程序报Async support must be enabled on a servlet and for all filters。。。错误,但是jdk,tomcat版本和测试都完全一样。测试环境可以通过,但uat不行。最后借助google才解决了问题。说句题外话,百度,bing都解决不了这个,呵呵。
最后查找到uat环境的tocmat使用了redis进行session共享,在tomcat/conf/context.xml中有这样一句配置:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
没有配置异步支持,Value中加上asyncSupported="true"属性,就可以解决了。