簡體   English   中英

如何在運行時從Java代碼獲取server.xml中已配置的HTTP和HTTPS端口號

[英]How to get the configured HTTP and HTTPS port numbers in server.xml from Java code at runtime

在我們的項目中,我們已經使用Apache CXF框架實現了SOAP Web服務。 客戶端過去曾請求服務器執行某些命令。 該請求包括主機,端口和用於連接的協議。 如果客戶端使用HTTPS配置的端口號並將協議指定為HTTP,則我們將拒絕連接-如預期的套接字異常。 但是,我需要拋出一條正確的錯誤消息,例如“無法使用http協議通過端口“ ABC”連接到主機“ XYZ”。 為此,我需要在運行時從tomcat server.xml文件中獲取已配置的http和https端口號,然后將其與我的請求參數進行比較。

有人,請幫我找回它嗎?

您始終可以解析tomcat的server.xml文件並獲取端口值:

  public static Integer getTomcatPortFromConfigXml(File serverXml) {
   Integer port;
   try {
      DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
      domFactory.setNamespaceAware(true); // never forget this!
      DocumentBuilder builder = domFactory.newDocumentBuilder();
      Document doc = builder.parse(serverXml);
      XPathFactory factory = XPathFactory.newInstance();
      XPath xpath = factory.newXPath();
      XPathExpression expr = xpath.compile
        ("/Server/Service[@name='Catalina']/Connector[count(@scheme)=0]/@port[1]");
      String result = (String) expr.evaluate(doc, XPathConstants.STRING);
      port =  result != null && result.length() > 0 ? Integer.valueOf(result) : null;
   } catch (Exception e) {
     port = null;
   }
   return port;
}

上面的代碼應該為您提供來自server.xml的HTTP端口。 對於HTTPS端口,必須將XPathExpression修改為

XPathExpression expr = xpath.compile
            ("/Server/Service[@name='Catalina']/Connector[@scheme='https']/@port[1]");

請注意,以上代碼段基於以下假設:server.xml是標准tomcat的服務器文件,其中服務名稱定義為“ Catalina”。 以下是標准的server.xml文件:

<Server>
    <Service name="Catalina">
        <Connector port="8080">
            #...
        </Connector>
    </Service>
</Server>

參考: 代碼鏈接

可以通過這種方式在運行時訪問Tomcat核心類(對於Tomcat 7,我尚未測試Tomcat 8):

import java.lang.management.ManagementFactory;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.apache.catalina.Service;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardServer;
import org.apache.log4j.Logger;

public class TomcatConnectors {

    public static final String CATALINA_SERVICE_NAME = "Catalina";

    public static final String CONNECTOR_HTTP_PROTOCOL_NAME = "HTTP/1.1"; 

    private Logger logger = Logger.getLogger(this.getClass());

    private Collection<Connector> connectors;

    /**
     * 
     */
    public TomcatConnectors() {
        super();
        this.connectors = new HashSet<Connector>();
        this.loadConnectors();
        this.getConnectorPorts();
    }

    /**
     * 
     * @return
     */
    protected StandardServer getServerInstance(){
        org.apache.catalina.core.StandardServer server = null; 
        try{
            MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
            server = (StandardServer)mbeanServer.getAttribute(
                        new ObjectName("Catalina:type=Server"),
                        "managedResource"
                    );
            if(logger.isDebugEnabled()){
                logger.debug("Server found. Info: ");
                logger.debug(" - address          : " + server.getAddress());
                logger.debug(" - domain           : " + server.getDomain());
                logger.debug(" - info             : " + server.getInfo());
                logger.debug(" - shutdown port    : " + server.getPort());
                logger.debug(" - shutdown command : " + server.getShutdown());
                logger.debug(" - serverInfo       : " + server.getServerInfo());
                logger.debug(" - status           : " + server.getStateName());

            }               

        }catch(Throwable t){
            logger.fatal("Fatal Error Recovering StandardServer from MBeanServer : " + t.getClass().getName() + ": " + t.getMessage(), t);
        }
        return server;
    }

    /*
     * 
     */
    protected Service getCatalinaService(){
        org.apache.catalina.core.StandardServer server = this.getServerInstance();
        Service[] services = server.findServices();
        for(Service aService : services){
            if(logger.isDebugEnabled()){
                logger.debug("Service: " + aService.getName() + 
                        ", info: " + aService.getInfo() + 
                        ", state: " + aService.getStateName());
            }

            if(aService.getName().equalsIgnoreCase(CATALINA_SERVICE_NAME)){
                return aService;                
            }
        }
        return null;
    }

    protected void loadConnectors() {
        Service catalinaService = this.getCatalinaService();
        if(catalinaService == null){
            throw new IllegalStateException("Service Catalina cannot be null");
        }
        if(catalinaService.findConnectors() != null && catalinaService.findConnectors().length > 0){
            logger.debug("List of connectors: ");
            for(Connector aConnector : catalinaService.findConnectors()){
                if(logger.isDebugEnabled()){
                    logger.debug("Connector.getProtocol: " + aConnector.getProtocol());
                    logger.debug("Connector.getPort: " + aConnector.getPort());
                    logger.debug("Connector.getInfo: " + aConnector.getInfo());
                    logger.debug("Connector.getStateName: " + aConnector.getStateName());
                    logger.debug("Connector.property.bindOnInit: " + aConnector.getProperty("bindOnInit"));
                    logger.debug("Connector.attribute.bindOnInit: " + aConnector.getAttribute("bindOnInit"));
                    logger.debug("Connector.getState: " + aConnector.getState());
                }
                this.connectors.add(aConnector);
            }
        }
    }

    /**
     * @return the connectors
     */
    public Collection<Connector> getConnectors() {
        if(this.connectors.isEmpty()){
            this.loadConnectors();
        }
        return connectors;
    }

    public Map<String, Set<Integer>> getConnectorPorts(){
        if(this.connectors.isEmpty()){
            this.loadConnectors();
        }
        Map<String, Set<Integer>> connectorPorts = new HashMap<String, Set<Integer>>();
        for(Connector c: this.connectors){
            Set<Integer> set;
            if(!connectorPorts.containsKey(c.getProtocol())){
                set = new HashSet<Integer>();
                set.add(c.getLocalPort());
            }else{
                set = connectorPorts.get(c.getProtocol());
                set.add(c.getLocalPort());
            }           

            connectorPorts.put(c.getProtocol(), set);
        }
        logger.debug("connectorPorts : " + connectorPorts);     
        return connectorPorts;
    }

}

這是我測試過的配置:

<Service name="Catalina">

    <Connector port="8787" protocol="HTTP/1.1" />

    <Connector port="8009" protocol="AJP/1.3" />

    ...

這是輸出:

TomcatConnectors:137 - connectorPorts : {HTTP/1.1=[8787], AJP/1.3=[8009]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM