从网页上的java web start发送userId

时间:2012-10-13 21:53:38

标签: java authentication parameters jnlp sessionid

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

我需要某种方法来识别发送到服务器的每个文件的用户,但我还是无法弄清楚如何执行此操作。

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

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

2 个答案:

答案 0 :(得分:0)

充当客户端的Web启动应用程序可以像任何其他客户端一样向服务器标识自己 - 只需让用户在会话开始时登录即可。但由于桌面客户端可以访问本地文件系统,因此可以在本地存储用户信息。这意味着诸如userID和配置首选项之类的数据可以存储在本地硬盘驱动器上。由于我们希望我们的桌面客户端跨平台工作,并且由于开发人员无法准确知道此应用程序从哪个目录启动,因此我们使用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应用程序与服务器进行通信。

答案 1 :(得分:0)

我们想以某种方式将登录身份从Web浏览器转移到另一个应用程序(如您的JNLP程序) 这是一个非常规的黑客攻击,但我认为它应该有效:

  1. 当用户登录Web应用程序时,将用户ID和请求IP地址存储在表中。这可以是数据库表或本地文件。
  2. 当java应用程序启动时,它会向Servlet发送一个getID请求。
  3. servlet查找请求的IP地址并使用ID进行响应。 servlet可以只返回ID - 不需要用XML或HTML包装它。
  4. 我认为只要您没有两个不同的用户尝试从同一IP地址大约同时登录,这应该可以正常工作。如果同一网络上的两个人正在使用此服务,则他们可能正在使用具有共享相同公共IP的私有IP的计算机。我们需要存储有关本地计算机的其他内容以区分这两个用户。例如,Java可以轻松读取计算机名称。如果你可以让你的浏览器也读取类似的东西,那么这可以与IP地址一起放在表中以解决重复的IP问题。这个stack overflow question

    中提到了一些想法