如何在 Java Web 应用程序中获取服务器名称

2023-11-27

我有一个 Web 应用程序,用户将其部署在自己的 Java Web 服务器(例如 Tomcat)上。 Web 应用程序的 Java 端需要报告 Web 应用程序本身的 URL(例如http://aServer.com:8080/MyApp or https://blah.blahSever/MyApp)。然而,由于许多用户使用端口转发和其他网络技术,Web 应用程序经常报告错误的名称。

我尝试过以下技术,但通常它们实际上并不能产生用户所需的结果。

注意(请求是一个 HttpServletRequest)

request.getLocalAddr();    // Returns: 127.0.0.1
request.getLocalName();    // Returns: localhost
request.getServerName();   // Returns: localhost
request.getServerPort();   // Returns: 8080
request.getContextPath();  // Returns: /MyApp

request.getScheme();       // Returns: http

InetAddress.getLocalHost().getHostName();           // Returns: serverXXX-XXX-XXX-XX.xxxx-xxxxxxx.net
InetAddress.getLocalHost().getHostAddress();        // Returns: xxx.xxx.xxx.xxx (ip address)
InetAddress.getLocalHost().getCanonicalHostName();  // Returns: serverXXX-XXX-XXX-XX.xxxx-xxxxxxx.net

InetAddress 的使用接近我想要的,但由于我们在 Apache2 服务器中使用服务器别名和 ProxyPass,因此 InetAddress 的值是服务器的实际值而不是别名。

我能想到的解决这个问题的唯一技术是用户在属性文件中提供一个属性,Web 应用程序在启动时读取该属性。如果设置了该属性,则该值用于返回完整的 Web 应用程序路径(例如 serverUrl =https://blah.blahServer/MyApp)。这种技术可行,但需要为我的客户提供更多的部署工作。

有谁对我如何实现更优雅的解决方案有任何想法?

谢谢, 菲尔


检查“主机”请求标头。大多数客户端添加该标头来指示他们尝试联系的主机。

这与 VirtualHosts 使用的标头相同,因此它非常标准。它在 HTTP1.1 请求中也是强制性的。

事实上,您不能纯粹从服务器端获取该值,因为用户可能已经为您的服务器定义了自己的主机名。

request.getHeader("Host")

如果您的服务器位于 apache 反向代理后面,请使用代理保留主机指令以确保主机标头保持完整。我确信其他反向代理也有类似的选项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Java Web 应用程序中获取服务器名称 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 为什么 regex_match 会抛出“复杂性异常”?

    我正在尝试测试 使用boost regex 文件中的行是否仅包含由空格分隔的数字条目 我遇到了一个我不明白的异常 见下文 如果有人能解释为什么会抛出它 那就太好了 也许我在定义模式时做了一些愚蠢的事情 这是代码 regex test cpp
  • 异步分派递归块

    假设我运行这段代码 block int step 0 block dispatch block t myBlock myBlock if step STEPS COUNT return step dispatch time t delay
  • Java 中的排出标准错误

    从 Java 启动进程时 如果我不从管道读取数据 stderr 和 stdout 都会阻塞输出 目前 我有一个线程主动从一个线程读取数据 而主线程则在另一个线程上阻塞 有没有一种简单的方法来连接两个流或以其他方式导致子进程继续 同时不丢失
  • delegate.Invoke 如何工作?

    如果我在代码中创建一个委托 例如 delegate void dostuff string o 这会生成一个派生自的类System MulticastDelegate它实现了三种方法 Invoke BeginInvoke and EndIn
  • jQuery:当“dblclick”即将发生时抑制“click”?

    假设我有一个 span 当您单击此跨度时 我想要一个save 功能来开火 当您双击跨度时 我想要一个rename 功能来开火 但是 如果双击跨度 首先click事件将会触发 然后dblclick事件 自从click先于dblclick 我怎
  • Flutter 中的 VoidCallback 是如何工作的?

    我从互联网上了解到的信息是无效回调 是不带参数也不返回任何参数的函数 以下代码来自应用程序 并且该应用程序运行良好 我想问一下使用 VoidCallback 作为type而不是作为function 我是 Flutter 开发的绝对初学者 请
  • _int64 没有命名类型

    In my pch文件我有以下定义 if MSC VER lt 1300 typedef signed char int8 t typedef signed short int16 t typedef signed int int32 t
  • 如何使用javascript调用按钮点击事件背后的代码

    是否可以使用 javascript 或 jquery 调用服务器端按钮单击事件 如果是的话该怎么做 假设这是你的 html
  • 检查浏览器通知是否可用

    我正在处理浏览器通知 因为它不适用于我想签入的每个浏览器JS code 如果可用的话 我查看了 Mozilla 开发者部分 https developer mozilla org en US docs Web API Notificatio
  • JQuery 多个选择器,$(this) 引用?

    鉴于以下 identifier div first idetifier2 fadeOut 300 function I need to reference just the identifier div first element howe
  • 递归计算 DataFrame 值

    我正在尝试 递归 计算 pandas 数据框的列值 假设有两个不同日期的数据 每个日期有 10 个观测值 并且您想要计算某个变量 r 其中仅给出 r 的第一个值 每天 并且您想要计算剩余的 2 9 条目 而每个后续值取决于在 r 的前一个条
  • 如何按第一维对张量进行排序

    我有一个 2D 张量 我想按第一个维度排序 如下例所示 a torch FloatTensor 5 5 5 3 3 5 6 4 3 7 我预计排序后的结果是这样的 a torch FloatTensor 3 5 3 7 5 3 5 5 6
  • 尝试对 var/www/html 使用符号链接

    这就是我想要实现的目标 从中创建符号链接var www html到主目录中的目录 文件夹 我试图在 home 中符号链接到的目录 是一个 git 存储库 如果这有什么区别的话 我在这个目录中有一个index html 文件 我使用以下命令在
  • 如何在 MySQL 中插入大量行?

    例如 如何使用单个查询将 100 000 行插入 MySQL 表中 insert into table values 1 a b 2 c d 3 e f 这将执行 3 行的插入 根据需要继续达到 100 000 在进行 ETL 工作时 我会
  • 使用元类理解 __call__ [重复]

    这个问题在这里已经有答案了 据我了解 call 类中的方法实现了函数调用运算符 例如 class Foo def init self print I m inside the init method def call self print
  • 在Linux Ubuntu下启动时自动运行程序[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 每次启动 Ubuntu Linux 时我都需要运行一个程序 所以我需要将其添加到我的启动程序列表中 只有一个问题 我需要通过终端来完成此操作 sudo mv filename etc
  • 使用 jquery 根据
    标签拆分字符串

    我如何分割包含的字符串 br 使用 jquery 进行标记 我尝试了以下代码 但在控制台中出现错误 我不知道如何根据分割字符串 br 标签 这是我尝试过的代码 jQuery document ready function var lines
  • 如何计算一个数字最接近的 2 或 10 次方?

    计算 2 或 10 与另一个数字最接近的幂的最有效方法是什么 例如 3 5 对于 2 的幂返回 4 对于 10 的幂返回 1 123 将返回 2 的幂 128 和 10 的幂 100 0 24 对于 2 的幂返回 0 25 对于 10 的幂
  • 如何从内核树构建 BPF 程序

    内核提供了许多示例samples bpf 我有兴趣在树之外构建一个示例 就像我们构建一个内核模块一样 其中Makefile可以很简单 是否可以对 bpf 执行相同的操作 我尝试从中删除不必要的部分samples bpf Makefile并保
  • 如何在 Java Web 应用程序中获取服务器名称

    我有一个 Web 应用程序 用户将其部署在自己的 Java Web 服务器 例如 Tomcat 上 Web 应用程序的 Java 端需要报告 Web 应用程序本身的 URL 例如http aServer com 8080 MyApp or