从网页的JavaWebStart发送用户ID

从网页的JavaWebStart发送用户ID,java,authentication,parameters,jnlp,sessionid,Java,Authentication,Parameters,Jnlp,Sessionid,我正在开发一个JSF2站点,用户可以通过JavaWebStart启动java应用程序。该应用程序解析mp3元数据并发回一个包含解析信息的xml文件 我需要某种方法来识别发送到服务器的每个文件的用户,但我还没有弄清楚如何做到这一点 换句话说,目标是能够在用户将xml文件发送到服务器之前在xml文件中设置用户ID。为了做到这一点,我需要在JavaWebStart应用程序中以某种方式提供该Id 我的问题是:我如何获得身份证?假设最终目标是解析用户mp3文件并将元数据返回到服务器;任何关于如何更好地做到

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

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

换句话说,目标是能够在用户将xml文件发送到服务器之前在xml文件中设置用户ID。为了做到这一点,我需要在JavaWebStart应用程序中以某种方式提供该Id


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

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

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

/**
 *
 * 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服务器的通信方式与浏览器的通信方式相同。我发现这些库对于实现这一点非常有帮助。如果用户的浏览器位于代理之后,这可能需要一些额外的代码来允许java应用程序与服务器通信。

我们希望以某种方式将登录标识从web浏览器传输到另一个应用程序(如JNLP程序) 这是一个有点非传统的黑客行为,但我认为它应该有效:

  • 当用户登录到web应用程序时,将用户ID和请求IP地址存储在表中。这可以是数据库表或本地文件
  • 当java应用程序启动时,它向Servlet发送一个getID请求
  • servlet查找请求的IP地址并用ID响应。servlet只需发送回ID,无需将其包装为XML或HTML
    我认为只要你没有两个不同的用户试图在同一时间从同一个IP地址登录,这应该是可行的。如果同一网络上的两个人正在使用此服务,则他们可能正在使用具有共享同一公共IP的专用IP的计算机。我们需要存储有关本地计算机的其他信息,以区分这两个用户。例如,Java可以很容易地读取计算机名。如果你能让你的浏览器也读到类似的内容,那么这可以和IP地址一起放在表中,以解决重复的IP问题。这篇文章中提到了一些想法

    如何通过网站上的服务登录您的应用程序?你可以通过这种方式获取用户或id。关于在jws应用程序中获取用户名的问题,我尝试在这里回答:如果你还有其他问题,我可以尝试澄清。谢谢你的回答!然而,我希望避免让用户在应用程序中输入登录信息,而是从他已经登录的站点获取。这将有助于提高可用性,因为我发现在用户启动web start应用程序时自动设置用户ID更为优雅。我目前的解决方案是让用户在将xml文件发送到站点之前输入用户名(该用户名随元数据添加到xml文件中),但这正是我希望避免的。使用我的方法,用户只需在第一次在特定计算机上使用您的站点时输入此信息。但我有另一个想法…见下文。非常感谢你花时间来讨论这个问题。我会试试你的解决方案;它应该会起作用。目前,我允许用户在将xml发送到服务器之前输入用户名。这样我就可以在数据库里查到他。尽管如此,我还是觉得很奇怪,很难找到关于这个的任何信息。我是说;JWS通常不是从web站点使用的,而web站点通常使用某种身份验证?鉴于此,框架中是否应该有某种机制在JWS启动时从站点发送信息?JWS是一种客户端技术,我们可以使用它来代替web站点应用程序。我用它为学校构建了一个排课应用程序,因为我讨厌使用JavaScript,它允许我使用OOP技术构建一个复杂的UI。签名的Java应用程序还可以与本地打印机、本地文件系统和网络进行通信——它可以感觉像一个带有桌面快捷方式和文件关联的本地应用程序。我的应用程序在这里: