取消注释server.xml中的SSL配置,使用xslt的tomcat

问题描述:

我正在尝试编写xslt文件,该文件将检查server.xml以进行SSL配置。取消注释server.xml中的SSL配置,使用xslt的tomcat

  • 如果SSL配置已经存在,请保持原样。
    • 即使注释部分也存在,它不应该被取消注释(否则将有两个SSL配置),因为SSL配置已经可用。
  • 如果对SSL配置部件进行了注释,请取消该部件的注释。
    • 如果评论部分不存在,我们应该自行放置SSL配置。

我已经浪费了两天找到一种方法,有将它设置一个变量,如果没有发现,因为我们有多个“构造”的元素,但无法成功设置变量配置。请告诉我怎样才能达到我需要的。

server.xml是;

<?xml version='1.0' encoding='utf-8'?> 
<?xml-stylesheet type="text/xsl" href="new2.xsl"?> 
<!-- Note: A "Server" is not itself a "Container", so you may not 
    define subcomponents such as "Valves" at this level. 
    Documentation at /docs/config/server.html 
--> 
<Server port="8005" shutdown="SHUTDOWN"> 

    <!--APR library loader. Documentation at /docs/apr.html --> 
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 
    <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html --> 
    <Listener className="org.apache.catalina.core.JasperListener" /> 
    <!-- Prevent memory leaks due to use of particular java/javax APIs--> 
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> 
    <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html --> 
    <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> 
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> 

    <!-- Global JNDI resources 
     Documentation at /docs/jndi-resources-howto.html 
    --> 
    <GlobalNamingResources> 
    <!-- Editable user database that can also be used by 
     UserDatabaseRealm to authenticate users 
    --> 
    <Resource name="UserDatabase" auth="Container" 
       type="org.apache.catalina.UserDatabase" 
       description="User database that can be updated and saved" 
       factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
       pathname="conf/tomcat-users.xml" /> 
    </GlobalNamingResources> 

    <!-- A "Service" is a collection of one or more "Connectors" that share 
     a single "Container" Note: A "Service" is not itself a "Container", 
     so you may not define subcomponents such as "Valves" at this level. 
     Documentation at /docs/config/service.html 
    --> 
    <Service name="Catalina"> 

    <!--The connectors can use a shared executor, you can define one or more named thread pools--> 
    <!-- 
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
     maxThreads="150" minSpareThreads="4"/> 
    --> 


    <!-- A "Connector" represents an endpoint by which requests are received 
     and responses are returned. Documentation at : 
     Java HTTP Connector: /docs/config/http.html (blocking & non-blocking) 
     Java AJP Connector: /docs/config/ajp.html 
     APR (HTTP/AJP) Connector: /docs/apr.html 
     Define a non-SSL HTTP/1.1 Connector on port 8080 
    --> 

    <Connector port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1" 
       connectionTimeout="20000" 
       redirectPort="8443" /> 
    <!-- A "Connector" using the shared thread pool--> 

    <!--<Connector executor="tomcatThreadPool" 
       port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1" 
       connectionTimeout="20000" 
       redirectPort="8443" />--> 

    <!-- Define a SSL HTTP/1.1 Connector on port 8443 
     This connector uses the JSSE configuration, when using APR, the 
     connector should be using the OpenSSL style configuration 
     described in the APR documentation --> 

    **<!--<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
       maxThreads="150" scheme="https" secure="true" 
       keystoreFile="${user.home}/.keystore" keystorePass="changeit" 
       clientAuth="false" sslProtocol="TLS" />-->** 



    <!-- Define an AJP 1.3 Connector on port 8009 --> 
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 


    <!-- An Engine represents the entry point (within Catalina) that processes 
     every request. The Engine implementation for Tomcat stand alone 
     analyzes the HTTP headers included with the request, and passes them 
     on to the appropriate Host (virtual host). 
     Documentation at /docs/config/engine.html --> 

    <!-- You should set jvmRoute to support load-balancing via AJP ie : 
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">   
    --> 
    <Engine name="Catalina" defaultHost="localhost"> 

     <!--For clustering, please take a look at documentation at: 
      /docs/cluster-howto.html (simple how to) 
      /docs/config/cluster.html (reference documentation) --> 
     <!-- 
     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 
     -->   

     <!-- The request dumper valve dumps useful debugging information about 
      the request and response data received and sent by Tomcat. 
      Documentation at: /docs/config/valve.html --> 
     <!-- 
     <Valve className="org.apache.catalina.valves.RequestDumperValve"/> 
     --> 

     <!-- This Realm uses the UserDatabase configured in the global JNDI 
      resources under the key "UserDatabase". Any edits 
      that are performed against this UserDatabase are immediately 
      available for use by the Realm. --> 
     <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
      resourceName="UserDatabase"/> 

     <!-- Define the default virtual host 
      Note: XML Schema validation will not work with Xerces 2.2. 
     --> 
     <Host name="localhost" appBase="webapps" 
      unpackWARs="true" autoDeploy="true" 
      xmlValidation="false" xmlNamespaceAware="false"> 

     <!-- SingleSignOn valve, share authentication between web applications 
      Documentation at: /docs/config/valve.html --> 
     <!-- 
     <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> 
     --> 

     <!-- Access log processes all example. 
      Documentation at: /docs/config/valve.html --> 
     <!-- 
     <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
       prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/> 
     --> 

     </Host> 
    </Engine> 
    </Service> 
</Server> 

编辑的从由以下JLRishe是答案XSLT;

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="comment()[not(../Connector[@scheme = 'https']) and 
           contains(., 'Connector') and 
           (contains(., 'scheme=https') or 
            contains(., scheme='https'))]"> 
    <xsl:value-of select="." disable-output-escaping="yes" /> 
    </xsl:template> 

    <xsl:template match="Service[not(Connector[@scheme = 'https'] or 
            comment()[contains(., 'Connector') and 
              (contains(., 'scheme=https') or 
               contains(., scheme='https'))] 
           )]"> 

    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 

    <!-- Add the missing Connector here --> 

    <xsl:element name="Connector"> 
     <xsl:attribute name="port">8443</xsl:attribute> 
     <xsl:attribute name="protocol">HTTP/1.1</xsl:attribute> 
     <xsl:attribute name="SSLEnabled">true</xsl:attribute> 
     <xsl:attribute name="maxThreads">150</xsl:attribute> 
     <xsl:attribute name="scheme">https</xsl:attribute> 
     <xsl:attribute name="secure">true</xsl:attribute> 
     <xsl:attribute name="keystroreFile">${user.home}/.keystore</xsl:attribute> 
     <xsl:attribute name="keystorePass">changeit</xsl:attribute> 
     <xsl:attribute name="clientAuth">false</xsl:attribute> 
     <xsl:attribute name="sslProtocol">TLS</xsl:attribute> 
    </xsl:element> 
    </xsl:copy> 
    </xsl:template>   
</xsl:stylesheet> 

以上XSLT只是适用于所有的场景,只是加入新的元素时没有被发现,它被添加Connector元素只是</Service>前关闭标签,但它是在<Engine>开始标记连同之前需要内<Service>其他连接器元件

谢谢。

未找到SSL配置时生成的xml如下;

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="new2.xsl"?> 
<!-- Note: A "Server" is not itself a "Container", so you may not 
    define subcomponents such as "Valves" at this level. 
    Documentation at /docs/config/server.html 
--> 
<Server port="8005" shutdown="SHUTDOWN"> 

    <!--APR library loader. Documentation at /docs/apr.html --> 
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 
    <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html --> 
    <Listener className="org.apache.catalina.core.JasperListener" /> 
    <!-- Prevent memory leaks due to use of particular java/javax APIs--> 
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> 
    <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html --> 
    <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> 
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> 

    <!-- Global JNDI resources 
     Documentation at /docs/jndi-resources-howto.html 
    --> 
    <GlobalNamingResources> 
    <!-- Editable user database that can also be used by 
     UserDatabaseRealm to authenticate users 
    --> 
    <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> 
    </GlobalNamingResources> 

    <!-- A "Service" is a collection of one or more "Connectors" that share 
     a single "Container" Note: A "Service" is not itself a "Container", 
     so you may not define subcomponents such as "Valves" at this level. 
     Documentation at /docs/config/service.html 
    --> 
    <Service name="Catalina"> 

    <!--The connectors can use a shared executor, you can define one or more named thread pools--> 
    <!-- 
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
     maxThreads="150" minSpareThreads="4"/> 
    --> 


    <!-- A "Connector" represents an endpoint by which requests are received 
     and responses are returned. Documentation at : 
     Java HTTP Connector: /docs/config/http.html (blocking & non-blocking) 
     Java AJP Connector: /docs/config/ajp.html 
     APR (HTTP/AJP) Connector: /docs/apr.html 
     Define a non-SSL HTTP/1.1 Connector on port 8080 
    --> 

    <Connector port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 
    <!-- A "Connector" using the shared thread pool--> 

    <!--<Connector executor="tomcatThreadPool" 
       port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1" 
       connectionTimeout="20000" 
       redirectPort="8443" />--> 

    <!-- Define a SSL HTTP/1.1 Connector on port 8443 
     This connector uses the JSSE configuration, when using APR, the 
     connector should be using the OpenSSL style configuration 
     described in the APR documentation --> 





    <!-- Define an AJP 1.3 Connector on port 8009 --> 
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 


    <!-- An Engine represents the entry point (within Catalina) that processes 
     every request. The Engine implementation for Tomcat stand alone 
     analyzes the HTTP headers included with the request, and passes them 
     on to the appropriate Host (virtual host). 
     Documentation at /docs/config/engine.html --> 

    <!-- You should set jvmRoute to support load-balancing via AJP ie : 
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">   
    --> 
    <Engine name="Catalina" defaultHost="localhost"> 

     <!--For clustering, please take a look at documentation at: 
      /docs/cluster-howto.html (simple how to) 
      /docs/config/cluster.html (reference documentation) --> 
     <!-- 
     <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> 
     -->   

     <!-- The request dumper valve dumps useful debugging information about 
      the request and response data received and sent by Tomcat. 
      Documentation at: /docs/config/valve.html --> 
     <!-- 
     <Valve className="org.apache.catalina.valves.RequestDumperValve"/> 
     --> 

     <!-- This Realm uses the UserDatabase configured in the global JNDI 
      resources under the key "UserDatabase". Any edits 
      that are performed against this UserDatabase are immediately 
      available for use by the Realm. --> 
     <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" /> 

     <!-- Define the default virtual host 
      Note: XML Schema validation will not work with Xerces 2.2. 
     --> 
     <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> 

     <!-- SingleSignOn valve, share authentication between web applications 
      Documentation at: /docs/config/valve.html --> 
     <!-- 
     <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> 
     --> 

     <!-- Access log processes all example. 
      Documentation at: /docs/config/valve.html --> 
     <!-- 
     <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
       prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/> 
     --> 

     </Host> 
    </Engine> 
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" keystroreFile="${user.home}/.keystore" keystorePass="changeit" clientAuth="false" sslProtocol="TLS" /></Service> 
</Server> 

这应该取消对试图连接器的工作,如果有尚未匹配的一个,或添加一个新的,如果它不存在:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@* | node()" name="Copy"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
    <xsl:template match="@* | node()" mode="insertConnector"> 
    <xsl:call-template name="Copy" /> 
    </xsl:template> 

    <xsl:template match="comment()[not(../Connector[@scheme = 'https']) and 
           contains(., '&lt;Connector') and 
           (contains(., 'scheme=&quot;https&quot;') or 
            contains(., &quot;scheme='https'&quot;))]"> 
    <xsl:value-of select="." disable-output-escaping="yes" /> 
    </xsl:template> 

    <xsl:template match="Service[not(Connector[@scheme = 'https'] or 
            comment()[contains(., '&lt;Connector') and 
              (contains(., 'scheme=&quot;https&quot;') or 
               contains(., &quot;scheme='https'&quot;))] 
           )] 
         "> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()" mode="insertConnector" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- Add the new connector after the last existing Connnector if there is one --> 
    <xsl:template match="Connector[last()]" mode="insertConnector"> 
    <xsl:call-template name="Copy" /> 

    <xsl:call-template name="AddConnector" /> 
    </xsl:template> 

    <!-- ... or before the first Engine if there is no existing Connector --> 
    <xsl:template match="Engine[1][not(preceding-sibling::Connector)]" 
       mode="insertConnector"> 
    <xsl:call-template name="AddConnector" /> 

    <xsl:call-template name="Copy" /> 
    </xsl:template> 

    <xsl:template name="AddConnector"> 
    <!-- This is the new connector --> 
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
       maxThreads="150" scheme="https" secure="true" 
       keystroreFile="${{user.home}}/.keystore" keystorePass="changeit" 
       clientAuth="false" sslProtocol="TLS" /> 
    </xsl:template> 
</xsl:stylesheet> 
+0

谢谢你的答案;我想删除评论,所以使用第二个选项为我工作。 但是有没有办法来处理以下两种情况? 1)其中评论的SSL配置也可以与SSL配置一起使用,而无需评论?以上代码现在将创建带有两个SSL配置的新xml(将从注释的SSL配置中移除注释) 2)没有评论配置,因此我们如何才能发现没有配置可用?没有评论配置可用时,我知道添加新的SSL配置。 再次感谢 – nommyravian 2013-03-14 13:10:11

+0

请给以上的一个尝试。请尽量在描述中更加精确。你要求做的是_uncomment_一些文字,而不是删除评论。 – JLRishe 2013-03-14 13:47:14

+0

我已经编辑了现在的问题以及我需要的场景。请相应地指导我。 我真的很感谢你的回答和关心。谢谢。 – nommyravian 2013-03-14 14:53:35