gpt4 book ai didi

tomcat - 在 Tomcat 7 下启动期间获取完整的 servlet URL

转载 作者:行者123 更新时间:2023-11-28 21:48:13 25 4
gpt4 key购买 nike

我有一个使用 Tomcat 6 编写的 Web 应用程序,我正在尝试使其与 Tomcat 7 一起使用。在启动期间,应用程序除其他外,还会在某个远程目录中注册其 Web 服务组件。为此,它需要提供自己的 URL。以下(有点天真)方法应该返回 web 服务 URL:

import org.apache.catalina.ServerFactory;
import org.apache.catalina.connector.Connector;
.
.
.
private String getWsUrl(ServletContext context)
throws UnknownHostException, MalformedURLException {
String host = java.net.InetAddress.getLocalHost().getCanonicalHostName();
int port = -1;
for (Connector c : ServerFactory.getServer().findServices()[0].findConnectors()) {
if (c.getProtocol().contains("HTTP")) {
port = c.getPort();
break;
}
}
URL wsURL = new URL("http", host, port, context.getContextPath()
+ C.WEB_SERVICE_PATH /* this is just a constant string */ );
return wsURL.toString();
}

ServerFactory.getServer() 部分被证明是有问题的:在 Tomcat 7 中没有 org.apache.catalina.ServerFactory 类。关于如何实现的任何建议为 Tomcat 7 重写这个?我也很乐意拥有更便携、非特定于 tomcat 的代码。

最佳答案

我遇到了同样的问题:我需要知道端口号来为特定的 Tomcat 实例构建 URL,端口号可能会有所不同(因为我运行多个实例进行测试),并且从 Tomcat 7 开始 ServerFactory 已经消失.

我编写了以下代码来查找和解析 Tomcat server.xml 文件。它解析不多,只是获取 HTTP“端口”和“redirectPort”值。它取决于“catalina.home”或“catalina.base”系统属性,这些属性应该存在于任何正在运行的 Tomcat 实例中。美妙之处在于它不依赖于任何 Tomcat 类,而是使用 JVM 的 XML 解析器。

希望对您有所帮助。

public final class TomcatConfigUtil {

private static final String CONFIG_FILE_PATH = "conf/server.xml";

private static Map<String, String> properties = null;

// No instances, please.
private TomcatConfigUtil() { }


/**
* Get the configuration as a map of name/value pairs, or throw an exception if it wasn't found.
* All values are returned as Strings.
* <ul>
* <li> httpPort - the HTTP port</li>
* <li> httpRedirectPort - the HTTP redirect port (which seems to be the SSL port) </li>
* </ul>
* @exception FileNotFoundException if the configuration file wasn't found
* @exception IOException if there was a problem reading the configuration file
* @exception SAXException if there was a problem parsing the configuration file
*/
public static synchronized Map<String, String> getConfig() throws FileNotFoundException, IOException, SAXException {

if (properties != null) {

return properties;
}

final File serverConfigFile = findServerConfigFile();
if (serverConfigFile == null) {

throw new FileNotFoundException("Couldn't find the configuration file.");
}

final Map<String, String> tmpProperties = new HashMap<String, String>();

// Content-handler does the actual parsing.
final ServerConfigContentHandler contentHandler = new ServerConfigContentHandler(tmpProperties);
final XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.setContentHandler(contentHandler);

// Pass the config file as the input source for parsing.
final FileReader fileReader = new FileReader(serverConfigFile);
xmlReader.parse(new InputSource(fileReader));
fileReader.close();

return (properties = Collections.unmodifiableMap(tmpProperties));
}


private static File findServerConfigFile() {

if (System.getProperty("catalina.home") != null) {

final File file = new File(System.getProperty("catalina.home"), CONFIG_FILE_PATH);
if (file.isFile()) {

return file;
}
}

if (System.getProperty("catalina.base") != null) {

final File file = new File(System.getProperty("catalina.base"), CONFIG_FILE_PATH);
if (file.isFile()) {

return file;
}
}

return null;
}


/**
* ContentHandler implementation for the XML parser.
*/
private static class ServerConfigContentHandler implements ContentHandler {

private final Map<String, String> map;
private boolean inServerElement;
private boolean inCatalinaServiceElement;


private ServerConfigContentHandler(final Map<String, String> map) {

this.map = map;
}

@Override
public void startDocument() throws SAXException {

this.inServerElement = false;
this.inCatalinaServiceElement = false;
}

@Override
public void startElement(final String uri, final String localName, final String qName, final Attributes atts) throws SAXException {

if (!this.inServerElement && "Server".equals(localName)) {

this.inServerElement = true;
}
else if (this.inServerElement && "Service".equals(localName) && "Catalina".equals(atts.getValue("name"))) {

this.inCatalinaServiceElement = true;
}
else if (this.inCatalinaServiceElement && "Connector".equals(localName) && "HTTP/1.1".equals(atts.getValue("protocol"))) {

if ((atts.getValue("SSLEnabled") == null || "false".equals(atts.getValue("SSLEnabled"))) &&
(atts.getValue("secure") == null || "false".equals(atts.getValue("secure"))) &&
(atts.getValue("scheme") == null || "http".equals(atts.getValue("scheme")))) {

final String portStr = atts.getValue("port");
if (portStr != null) {

this.map.put("httpPort", portStr);
}
final String redirectPortStr = atts.getValue("redirectPort");
if (redirectPortStr != null) {

this.map.put("httpRedirectPort", redirectPortStr);
}
}
}
}

@Override
public void endElement(final String uri, final String localName, final String qName) throws SAXException {

if (this.inCatalinaServiceElement && "Service".equals(localName)) {

this.inCatalinaServiceElement = false;
}
else if (this.inServerElement && "Server".equals(localName)) {

this.inServerElement = false;
}
}

@Override
public void endDocument() throws SAXException {

this.inServerElement = false;
this.inCatalinaServiceElement = false;
}

@Override
public void characters(final char[] ch, final int start, final int length) throws SAXException { }

@Override
public void endPrefixMapping(final String prefix) throws SAXException { }

@Override
public void ignorableWhitespace(final char[] ch, final int start, final int length) throws SAXException { }

@Override
public void processingInstruction(final String target, final String data) throws SAXException { }

@Override
public void setDocumentLocator(final Locator locator) { }

@Override
public void skippedEntity(final String name) throws SAXException { }

@Override
public void startPrefixMapping(final String prefix, final String uri) throws SAXException { }
}

关于tomcat - 在 Tomcat 7 下启动期间获取完整的 servlet URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3739865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com