我的Java Web应用程序包含一个启动servlet。启动Web应用程序服务器(Tomcat)时,将调用其init()
方法。在这个方法中,我需要我的Web应用程序的URL。由于没有HttpServletRequest
,如何获取此信息?
答案 0 :(得分:5)
你做不到。因为“从内部”看不到“Java Web应用程序的URL”。 servlet不依赖于URL,而是从外部完成。 (也许你有一个连接到Tomcat的Apache服务器 - Tomcat无法知道它) 向HttpServletRequest询问其url是有意义的,因为我们说的是事件(实际用于生成此请求的URL)的信息,请求一个没有意义配置网址。
答案 1 :(得分:1)
解决方法可能是在第一个请求到达时执行初始化延迟。你可以实现一次过滤,例如通过在静态变量中存储boolean
标志并正确同步对标志的访问。但它意味着一点开销,因为每个后续请求都将通过过滤器,然后绕过初始化。这只是一个想法。
答案 2 :(得分:1)
servlet API中没有提供此信息的任何内容,而且任何给定的资源都可能绑定到多个URL。
您可以做的是在收到实际请求时检查servlet上下文并查看使用的URL。
答案 3 :(得分:1)
以下是它如何适用于我,可能适用于大多数配置:
public static String getWebappUrl(ServletConfig servletConfig, boolean ssl) {
String protocol = ssl ? "https" : "http";
String host = getHostName();
String context = servletConfig.getServletContext().getServletContextName();
return protocol + "://" + host + "/" + context;
}
public static String getHostName() {
String[] hostnames = getHostNames();
if (hostnames.length == 0) return "localhost";
if (hostnames.length == 1) return hostnames[0];
for (int i = 0; i < hostnames.length; i++) {
if (!"localhost".equals(hostnames[i])) return hostnames[i];
}
return hostnames[0];
}
public static String[] getHostNames() {
String localhostName;
try {
localhostName = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException ex) {
return new String[] {"localhost"};
}
InetAddress ia[];
try {
ia = InetAddress.getAllByName(localhostName);
} catch (UnknownHostException ex) {
return new String[] {localhostName};
}
String[] sa = new String[ia.length];
for (int i = 0; i < ia.length; i++) {
sa[i] = ia[i].getHostName();
}
return sa;
}