【问题标题】:Send userId at java web start from web page从网页开始在 java web 上发送 userId
【发布时间】:2012-10-04 08:21:12
【问题描述】:

我正在开发一个 JSF2 站点,用户可以在其中通过 java web start 启动 java 应用程序。该应用程序解析 mp3 元数据并发送回包含解析信息的 xml 文件。

我需要某种方法来识别发送到服务器的每个文件的用户,但我无法弄清楚如何做到这一点。

换句话说,目标是能够在用户将其发送到服务器之前在 xml 文件中设置 userId。为此,我需要以某种方式在 java web start 应用程序中提供该 ID。

我的问题是:我如何获得身份证?鉴于最终目标是解析用户 mp3 文件并将元数据返回服务器;任何关于如何以更好的方式做到这一点的想法都非常受欢迎。也许我描述的方式不是最好的。

【问题讨论】:

  • 如何通过网站上的服务登录您的应用程序?您可以通过这种方式获取用户或 ID。
  • 将用户名输入 jws 应用程序的方面我试图在这里回答:stackoverflow.com/questions/12861447/… 如果您还有其他问题,我可以尝试澄清一下。

标签: java authentication parameters jnlp sessionid


【解决方案1】:

我们希望以某种方式将登录身份从 Web 浏览器传输到另一个应用程序(例如您的 JNLP 程序) 这是一个非常规的 hack,但我认为它应该可以工作:

  1. 当用户登录 Web 应用程序时,将用户 ID 和请求 IP 地址存储在一个表中。这可以是数据库表或本地文件。
  2. 当 java 应用程序启动时,它会向 Servlet 发送一个 getID 请求。
  3. servlet 查找请求的 IP 地址并以 ID 响应。 servlet 可以只将 ID 发回 - 无需将其包装在 XML 或 HTML 中。

我认为只要您没有两个不同的用户几乎同时尝试从同一个 IP 地址登录,这应该可以工作。如果同一网络上的两个人正在使用此服务,他们可能正在使用具有共享相同公共 IP 的私有 IP 的计算机。我们需要存储有关本地计算机的其他内容以区分这两个用户。例如,Java 可以轻松读取计算机名称。如果您可以让您的浏览器也读取类似的内容,那么这可以与 IP 地址一起进入表格以解决重复 IP 问题。这个stack overflow question中提到了一些想法

【讨论】:

  • 非常感谢您抽出宝贵时间参与其中。我会考虑尝试您的解决方案;它应该工作。目前,我让用户在将 xml 发送到服务器之前输入他的用户名。这样我就可以在数据库中查找他。不过,我认为很难找到有关此的任何信息,这很奇怪。我是说;通常不是从网站使用 JWS,而后者又经常使用某种身份验证?鉴于此,框架中不应该有某种机制在 JWS 启动时从站点发送信息吗?
  • JWS 是一种客户端技术,我们可以将其用于网站应用程序的 INSTEAD。我用它为学校构建了一个日程安排应用程序,因为我讨厌使用 JavaScript,它允许我使用 OOP 技术构建一个复杂的 UI。签名的 Java 应用程序还可以与本地打印机、本地文件系统和网络进行通信——它可以感觉像是一个带有桌面快捷方式和文件关联的本机应用程序。我的应用在这里:proctinator.com
【解决方案2】:

作为客户端的 Web 启动应用程序可以像任何其他客户端一样向服务器标识自己 - 只需让用户在会话开始时登录即可。但是由于桌面客户端可以访问本地文件系统,因此可以将用户信息存储在本地。这意味着用户 ID 和配置首选项等数据可以存储在本地硬盘上。由于我们希望我们的桌面客户端能够跨平台工作,并且由于开发人员无法确切知道该应用程序是从哪个目录启动的,因此我们使用 preferences API 在本地文件系统之上提供一个抽象层。

如果用户在每次运行此应用程序时主要使用同一台计算机,那么这是存储配置信息和用户首选项的最便捷方式。这是一个例子:

/**
 *
 * Loads the user preferences from local storage using the Preferences API.
 * The actual location of this file is platform and computer user-login
 * dependant, but from the perspective of the preferences API, it is stored in 
 * a node referenced by the package this class resides in.
 */
private void loadPrefernces() {
    try {
        prefs = Preferences.userNodeForPackage(this.getClass());
    }
    catch(SecurityException stop) {
        JOptionPane.showMessageDialog(null, "The security settings on this computer are preventing the application\n"
                + "from loading and saving certain user preference data that the program needs to function.\n"
                + "Please have your network administrator adjust the security settings to allow a Java desktop\n"
                + "application to save user preferences. The exception the program encountered is below:\n"
                + stop.toString(),
                "Security Error", JOptionPane.ERROR_MESSAGE);
    }
    catch(Exception some) {
        System.out.println("Other Preference Exception:");
        System.out.println(some);
    }
    //extract information from the prefs object:
    String username = prefs.get("user","default-newUser");
    String userID = prefs.get("id", "0"); //a 0 ID means that the information was not found on the local computer.
}

//Use this method to store username and ID on the local computer.
public void saveUserPrefs() {
    prefs.put("user", user.getUsername() );
    prefs.put("id", "" + user.getID());
}

当然,如果这是用户第一次在计算机上运行应用程序或者用户没有分配 ID,上述代码对我们没有帮助。因此,我们需要构建一些登录功能。 JNLP 应用程序可以像浏览器那样与 Web 服务器通信。我发现httpClient 库对实现这一点非常有帮助。如果用户的浏览器在代理之后,这可能需要一些额外的代码来让您的 java 应用程序与服务器进行通信。

【讨论】:

  • 感谢您的回答!但是,我想避免让用户在应用程序中输入登录信息,而是从他已经登录的站点获取。这将提高可用性,因为我发现在用户启动 Web 启动应用程序时自动设置 userId 更优雅。我目前的解决方案是让用户在将 xml 文件发送到站点之前输入他的用户名(使用元数据添加到 xml 文件中),但这正是我想要避免的。
  • 使用我的方法,用户只需在他或她第一次在特定计算机上使用您的网站时输入此信息。但我有另一个想法……见下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 2015-04-28
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
相关资源
最近更新 更多