Tomcat 应用部署失败 STRICT_SERVLET_COMPLIANCE=true

Tomcat apps fail to deploy with STRICT_SERVLET_COMPLIANCE=true

我正在尝试通过更新 apache-tomcat-8.0.39\conf\catalina.properties 在 Tomcat 8.0.39 上使用选项 STRICT_SERVLET_COMPLIANCE=true 部署应用程序但是一旦我这样做,我的应用程序部署就会失败。 即我开始收到错误: SEVERE [localhost-startStop-1] org.apache.tomcat.util.digester.Digester.error 应用程序 web.xml 文件中所有标签的解析错误。

其中一个堆栈跟踪如下:

09-Feb-2017 15:06:32.189 SEVERE [localhost-startStop-1] org.apache.tomcat.util.digester.Digester.error Parse Error at line 5 column 66: Document root element "web-app", must match DOCTYPE root "xml". org.xml.sax.SAXParseException; systemId: file:/C:/Servers/Tomcat%208/apache-tomcat-8.0.39/webapps/file-service/WEB-INF/web.xml; lineNumber: 5; columnNumber: 66; Document root element "web-app", must match DOCTYPE root "xml". at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.rootElementSpecified(Unknown Source) at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleStartElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1448) at org.apache.tomcat.util.descriptor.web.WebXmlParser.parseWebXml(WebXmlParser.java:119) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1119) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:783) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:307) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:95) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5213) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

为了解决这个问题,我尝试了以下选项:

1) 在 catalina.properties 中添加了以下内容:

org.apache.catalina.STRICT_SERVLET_COMPLIANCE=true
org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=false

2) 更新代理 WAR web.xml 文件 将 web-app_3_0.xsd 更新为 web-app_2_5.xsd 更新版本=“3.0”与版本=“2.5”

我还尝试将 "web-app" 标签条目从 apache-tomcat-8.0.39\conf\web.xml 复制到我的应用程序 web.xml 但没有用.

3) 尝试将以下值设置为其各自的默认值 [作为设置

org.apache.catalina.STRICT_SERVLET_COMPLIANCE=true changes these defaults]
org.apache.catalina.core.ApplicationContext.GET_RESOURCE_REQUIRE_SLASH
org.apache.catalina.core.ApplicationDispatcher.WRAP_SAME_OBJECT
org.apache.catalina.core.StandardHostValve.ACCESS_SESSION
org.apache.catalina.session.StandardSession.ACTIVITY_CHECK
org.apache.catalina.session.StandardSession.LAST_ACCESS_AT_START
org.apache.tomcat.util.http.ServerCookie.STRICT_NAMING

The **URIEncoding** attribute of any HTTP connector or AJP connector element.
The **resourceOnlyServlets** attribute of any Context element.
The **tldValidation** attribute of any Context element.
The **useRelativeRedirects** attribute of any Context element.
The **xmlNamespaceAware** attribute of any Context element.
The **xmlValidation** attribute of any Context element.

但似乎没有任何效果。我也无法导航到 tomcat 管理器或部署的任何其他应用程序。

另一方面,当我在 catalina.properties

中写入 STRICT_SERVLET_COMPLIANCE=false 时,一切正常

这里有我遗漏的东西吗?请帮我解决这个问题。

此致, 布佩什

我也运行关注这个问题。我们工作的环境要求将 STRICT_SERVLET_COMPLIANCE 设置为 true,但 web.xml 的验证并不是要求背后的驱动力。要解决此问题,请尝试在 conf/context.xml 的标签中将 xmlValidation 设置为 false:

<Context xmlValidation="false"> ... </Context>