升级Tomcat10后OpenCMIS报Cannot get CSRF manager!,疑handleRequest未触发
我们为产品扩展了Open CMIS代码,近期将产品升级至Tomcat 10后,调用RepositoryService时出现如下错误:
java.base/java.lang.Thread.run(Thread.java:833) [21/07/23 01:11:23:023 IST] ERROR org.apache.chemistry.opencmis.server.impl.webservices.AbstractService: Cannot get CSRF manager! org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException: Cannot get CSRF manager! at org.apache.chemistry.opencmis.server.impl.webservices.AbstractService.checkCsrfToken(AbstractService.java:166) ~[chemistry-opencmis-server-bindings-1.1.0.jar:1.1.0] at org.apache.chemistry.opencmis.server.impl.webservices.AbstractService.getServiceForRepositoryInfo(AbstractService.java:187) ~[chemistry-opencmis-server-bindings-1.1.0.jar:1.1.0] at org.apache.chemistry.opencmis.server.impl.webservices.RepositoryService.getRepositories(RepositoryService.java:65) ~[chemistry-opencmis-server-bindings-1.1.0.jar:1.1.0] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?] at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
怀疑CmisWebServicesServlet中的handleRequest方法未被调用,导致无法在请求中设置必要属性,进而引发该CSRF相关错误,该方法代码如下:
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException { // set CMIS version and CSRF Manager request.setAttribute(CMIS_VERSION, cmisVersion); request.setAttribute(CSRF_MANAGER, csrfManager);
Servlet API 包名迁移不兼容
Tomcat 10及以上版本采用Jakarta EE规范,Servlet API的包名从javax.servlet变更为jakarta.servlet。而OpenCMIS 1.1.0版本依赖旧版javax.servletAPI,这会导致CmisWebServicesServlet无法被Tomcat 10容器正确加载和实例化,请求根本不会路由到该Servlet的handleRequest方法。web.xml配置的命名空间或版本问题
如果项目仍使用基于javax.servlet命名空间的旧版web.xml,Tomcat 10无法正确解析Servlet配置,导致CmisWebServicesServlet的映射失效,请求无法到达对应的处理逻辑。自定义扩展代码的请求拦截逻辑异常
你对OpenCMIS的扩展代码如果包含自定义Filter、Servlet包装类或请求拦截逻辑,在Tomcat 10环境下可能出现兼容性问题,比如拦截请求后未正确传递到CmisWebServicesServlet,导致handleRequest方法未被执行。CSRF管理器初始化失败
即使handleRequest方法被调用,也可能因为csrfManager实例初始化失败(比如依赖类加载异常、配置参数缺失),导致无法将其设置到请求属性中,最终触发该错误。
内容的提问来源于stack exchange,提问作者pvyas

