【问题标题】:System.getProperty("user.name") returns "?"System.getProperty("user.name") 返回 "?"
【发布时间】:2021-11-17 19:48:21
【问题描述】:

我正在尝试在我的 Java 代码中使用 System.getProperty("user.name") 来获取 Web 服务的用户名。不知何故,它正在返回“?” (问号)

主要问题是什么?

如果有人调用服务,我们是否需要从服务中传递用户名而不是使用系统属性?

【问题讨论】:

  • System.getProperty("user.name"); 返回user.name 的系统属性。因此,如果我们以java -Duser.name="foobar" ... 启动程序,此调用将返回"foobar"
  • 执行java -XshowSettings:properties -version 时是否得到正确的值?
  • 大多数属性返回的值取决于操作系统。也许您有一些安全设置禁止访问 Java 尝试从其中获取 user.name 值的任何内容。
  • OCP = RedHat OpenShift Container Platform,基本上是类似于 kubernetes 的东西。很有可能这是一个特权/保护问题。
  • 您想通过读取该用户名来达到什么目的?

标签: java


【解决方案1】:

Java 必须从操作系统环境中读取当前运行的用户名。如果操作系统环境没有为该用户提供名称,它会将user.name 属性设置为“?”在类 Unix 系统上和在 Windows 系统上“未知”。

Unix systems上的代码片段是:

    struct passwd *pwent = getpwuid(getuid());
    sprops.user_name = pwent ? strdup(pwent->pw_name) : "?";

Windows systems 上是:

    // ... various variants to try to read the user name
    // followed by
        sprops.user_name = (uname != NULL) ? uname : L"unknown";

如果您的代码在容器中运行,则容器会定义用于运行您的代码的 uid。

如果运行容器的系统没有该 uid 的用户名(或者如果系统或容器运行时不允许从容器内访问用户名),那么这就是您将看到的.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2021-07-27
    • 2011-08-03
    • 2013-06-01
    • 2011-06-03
    • 2017-01-11
    • 2015-09-03
    相关资源
    最近更新 更多