2017-07-28 162 views
1

我正在開發一個支持異步操作的servlet。 該servlet將通過多個過濾器進行調用。一些過濾器是通過DelegatingFilterProxy創建的FilterProxyChain的一部分。如何爲通過Spring DelegatingFilterProxy鏈調用的過濾器設置異步支持標誌?

如果我們必須從一個servlet啓動一個異步上下文,那麼過濾器鏈應該也支持異步操作。否則下面的例外獲取引發 -

28-JUL-2017 09:41:51.196嚴重[HTTP-NIO-127.0.0.1-7441-EXEC-2] org.apache.catalina.core.StandardWrapperValve.invoke的Servlet .service()用於與path []上下文中的servlet [eventBus]拋出異常 java.lang.IllegalStateException:當前鏈的過濾器或servlet不支持異步操作。 在org.apache.catalina.connector.Request.startAsync(Request.java:1630) 在org.apache.catalina.connector.Request.startAsync(Request.java:1623) 在org.apache.catalina.connector。 RequestFacade.startAsync(RequestFacade.java:1030) 在javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:379) 在javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:379) 在org.springframework.security。 web.servletapi.HttpServlet3RequestFactory $ Servlet3SecurityContextHolderAwareRequestWrapper.startAsync(HttpServlet3RequestFactory.java:167) 在com.amdocs.vshield.vsm.asyncrest.VsmAsyncRestController.doGet(VsmAsyncRestController.java:89) 在javax.servlet.http.HttpServlet.service( HttpServlet.java:622) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) at org.apache.catalina.core.ApplicationFilterChain。 doFilter(ApplicationFilterChain.java:207)

一些通過DelegatingFilterProxy調用的過濾器沒有明確地在web.xml中配置。 那麼如何讓這些過濾器支持異步?

回答

1

這裏是他們在說什麼這裏:https://spring.io/blog/2012/12/17/spring-security-3-2-m1-highlights-servlet-3-api-support/#servlet3-async

所以:

  1. Spring Security的版本必須是至少3.2
  2. web.xmlwebapp元素必須有version="3.0"
  3. DelegatingFilterProxy<filter>元素必須有<async-supported>true</async-supported>
  4. 其地圖平應具備以下條件:

<dispatcher>REQUEST</dispatcher> <dispatcher>ASYNC</dispatcher>

+0

它不工作。儘管如此,它仍然會失敗,同樣的例外我們如何配置過濾器來支持通過DelegatingProxyFilter調用的異步請求? –

0

終於找到了根源。 web.xml中有一些錯誤,因爲它沒有正確部署servlet /過濾器。不知道爲什麼tomcat沒有在這種情況下啓動失敗。 您必須添加所有過濾器(來自過濾鏈)/ servlet。價值爲真。