【问题标题】:Getting server name during servlet initialization在 servlet 初始化期间获取服务器名称
【发布时间】:2023-03-28 20:55:01
【问题描述】:

我知道请求对象具有获取服务器名称的功能。 (即 HttpServletRequest.getServerName() )

如果我在 servlet 的初始化中需要相同的功能怎么办?我该怎么做?

【问题讨论】:

  • 如果我调用 java.net.InetAddress.getLocalHost().getCanonicalHostName() 来获取服务器名称,是否有任何问题/问题?
  • 是的,当您有主机的别名时。例如,您的应用程序可能在http://www.google.com/ 下可见,而使用getCanonicalHostName() 可能会给您http://nuq05s02-in-f18.1e100.net/

标签: http servlets


【解决方案1】:

我认为这是不可能的。一个主机可以有多个名称。应该退回哪一个?并且主机可能甚至不知道 DNS 中配置的所有名称。

【讨论】:

  • 我认为提问者希望从 HttpServletRequest.getServerName() 但从通用 HttpServlet 获得相同的值。返回哪个名称有标准行为。
  • HttpServletRequest 确实包含一个服务器名称,因为 Web 浏览器发送一个。在 servlet 初始化时,没有读取服务器名称的请求。
【解决方案2】:

此信息是基于请求的,而不是严格基于应用程序的。它可以根据请求进行更改。在 servlet 初始化期间,您手头只有ServletContext 实例,它又提供了像getInitParameter() 这样的方法。您可以利用它来访问应用程序范围的设置。

所以最好的办法是手动将服务器名称设置为web.xml 中的上下文参数

<context-param>
    <param-name>serverName</param-name>
    <param-value>foo</param-value>
<context-param>

这样就可以在servlet的init()方法中获取如下:

String serverName = getServletContext().getInitParameter("serverName");

另一种(不推荐)替代方法是将其设置为 web.xml 中的显示名称

<display-name>foo</display-name>

这样你就可以通过如下方式获取:

String serverName = getServletContext().getServletContextName();

【讨论】:

    【解决方案3】:

    如果由于某种原因您不想使用 BalusC 的答案,并且您不需要立即使用该名称,则可以懒惰地使用。前几天我用这种方式实现了一个类似的场景:

    private volatile boolean initialized;
    
    public void doGet(..) {
        if (!initialized) {
           synchronized(this) {
              if (!initialized) {
                  initialize(request.getServerName())
              }
           }
        }
    }
    

    (延迟初始化的双重检查锁定可以通过多种方式实现。See wikipedia

    【讨论】:

      【解决方案4】:

      InetAddress.getLocalHost().getHostName()

      【讨论】:

        猜你喜欢
        • 2015-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        • 2014-05-24
        • 2016-06-14
        • 1970-01-01
        相关资源
        最近更新 更多